android.view.InflateException: двоичный XML-файл: ошибка надувания фрагмента класса

152

У меня очень расстраивающая ошибка, которую я не могу объяснить. Я создал приложение для Android, которое использует Android AppCompatего для совместимости со старыми версиями. Вот мой основной файл макета активности:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         If you're not building against API 17 or higher, use
         android:layout_gravity="left" instead. -->

    <!-- The drawer is given a fixed width in dp and extends the full height of
         the container. -->
    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.fragment.NavigationDrawerFragment" />

</android.support.v4.widget.DrawerLayout>

И вот основной код моей деятельности:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

Основная проблема здесь: приведенный выше код работает без проблем практически на устройствах (стимулируемых устройствах или некоторых реальных устройствах). Но когда я запускаю его на Samsung S3. Это замечает эту ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.access$700(ActivityThread.java:134)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4856)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
            at android.app.Activity.setContentView(Activity.java:1901)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)

Подскажите пожалуйста, как исправить ошибку, спасибо :)

HQT
источник
1
В этой строке вы получаете исключение, проверяющее правильность имени класса и имени пакета. Android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
pvs kalyan
1
Я проверил, и этот класс правда. Я могу скомпилировать и запустить на некоторых устройствах, но не Samsung S3. Я думаю, что некоторые странные проблемы здесь :(
HQT
вы правы, если он выполняется на каком-то устройстве, а не на s3, это странная проблема ..
мой
Я уже решил проблему здесь: stackoverflow.com/a/33128448/4366715 .
Даниэль Килинскас
1
Для тех, кто пытается диагностировать причину этой ошибки: Неподвижные исправления здесь - красная сельдь. Во время надувания фрагмента существует предыдущее исключение , которое не отображается в трассировке стека . Это может быть что угодно. Чтобы устранить проблему, вы должны выяснить, что является предыдущим исключением. Для этого смотрите мой ответ или @ DaveHubbard's.
LarsH

Ответы:

126

После долгого времени отладки я исправил эту проблему. (Хотя я до сих пор не могу объяснить, почему). Это я меняю свойство android:nameна class. (хотя в Android Document они говорят, что эти свойства одинаковы, но это работает !!!)

Итак, оно должно измениться с:

 android:name="com.fragment.NavigationDrawerFragment"

в

class = "com.fragment.NavigationDrawerFragment"

Итак, новый макет должен быть:

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->

<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    class = "com.fragment.NavigationDrawerFragment" />

Надеюсь это поможет :)

HQT
источник
4
Я столкнулся с этой проблемой, пытаясь следовать официальному руководству по Android. Ваше исправление (изменение android:idв class) работал для меня. Я также получил предупреждение Lint для изменения Fragmentк fragment, что я и сделал.
stevepastelan
9
@DownVoter: эта ошибка запутана. И я, к счастью, нашел способ исправить это. Мне очень жаль, если мой пост не может исправить вашу ошибку, потому что я также не могу объяснить, почему. Но я думаю, что он не должен получить отрицательный голос. :)
HQT
2
Интересно, если вы получили этот сбой надежно, не переходя с nameна class, у меня было несколько пользователей, сообщающих об этом сбое, но я не могу сам его воспроизвести!
Даниэль Уилсон,
8
Не работает для меня Я так устал. 2 часа разработки и не может найти, почему это не работает (строка двоичного файла XML ... ошибка, надувающая фрагмент класса). Любая идея ?
Cocorico
32

Я не мог решить свою проблему, используя предоставленные ответы. Наконец я изменил это:

<fragment
android:id="@+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="@layout/fragment_image_gallery"
tools:layout="@layout/fragment_image_gallery" />

к этому :

<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />

,

private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

и это работает.
Если вы используете его внутри фрагмента, используйте getChildFragmentManager вместо getSupportFragmentManager .

Реза
источник
31

TL / DR : во время создания фрагмента, на который ссылается XML-макет верхнего уровня, возникла исключительная ситуация. Это исключение вызвало сбой инфляции верхнего уровня, но первоначальное исключение не сообщалось ; только ошибка инфляции более высокого уровня обнаруживается в следе стека. Чтобы найти основную причину, вы должны поймать и зарегистрировать первоначальное исключение .


Первоначальной причиной ошибки может быть большое разнообразие вещей, поэтому здесь так много разных ответов относительно того, что решило проблему для каждого человека. Для некоторых это было связано с id, classили nameатрибутов. Для других это было связано с проблемой прав доступа или настройкой сборки. Для меня это не решило проблему; вместо этого был доступный ресурс, который существовал только в drawable-ldrtl-xhdpi, а не в соответствующем месте, как drawable.

Но это только детали. Проблема в общем состоит в том, что сообщение об ошибке, которое появляется в logcat, не описывает исключение, которое запустило все это. Когда XML макета верхнего уровня ссылается на фрагмент, onCreateView()вызывается фрагмент . Когда во фрагменте возникает исключениеonCreateView() (например, при раздувании XML-макета фрагмента), это приводит к сбою инфляции XML-макета верхнего уровня. Этот сбой инфляции более высокого уровня - то, что регистрируется как исключение в журналах ошибок. Но первоначальное исключение, кажется, не продвигается по цепочке достаточно хорошо, чтобы о нем сообщать.

Учитывая эту ситуацию, вопрос заключается в том, как отобразить исходное исключение, когда оно не отображается в журнале ошибок.

Решение довольно простое: поместите блок try/ catchвокруг содержимого фрагмента onCreateView(), а в catchпредложении запишите исключение:

public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

Может не быть очевидным, к какому классу фрагментов это onCreateView()нужно делать, и в этом случае делать это с каждым классом фрагментов, который используется в макете, вызвавшем проблему. Например, в случае OP код приложения, где произошло исключение, был

at android.app.Activity.setContentView(Activity.java:1901)

который

   setContentView(R.layout.activity_main);

Поэтому вам нужно отлавливать исключения onCreateView()из любых фрагментов, на которые есть ссылки в макете activity_main.

В моем случае исключение первопричины оказалось

Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

Это исключение не появилось в журнале ошибок, пока я не поймал его onCreateView()и не зарегистрировал его явно. После регистрации проблема стала достаточно легкой для диагностики и устранения ( почему-то details_view.xmlсуществовала только в ldrtl-xhdpiпапке). Ключ был в том, чтобы поймать исключение, которое было причиной проблемы, и выявить его.

Это не повредит сделать это как образец для всехonCreateView() методов ваших фрагментов . Если там есть необработанное исключение, это приведет к аварийному завершению операции. Разница лишь в том, что если вы поймаете и зарегистрируете исключение onCreateView(), вы не будете знать, почему это произошло.

PS Я только что понял, что этот ответ связан с @ DaveHubbard, но использует другой подход для поиска основной причины (логирование или отладчик).

LarsH
источник
2
Вы, вероятно, сэкономили мне часы отладки. Престижность!
Шимон Садло
16

У меня была такая же проблема, проблема, перепробовал все ответы в этой теме безрезультатно. Мое решение было, я не добавил идентификатор в XML деятельности. Я не думал, что это будет иметь значение, но это имело значение.

Итак, в Activity XML я имел:

<fragment
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Но должен был иметь:

<fragment
    android:id="@+id/some_fragment"
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Если кто-то с радостью прокомментирует, почему это так, я весь слух другим, надеюсь, это поможет.

ворковать
источник
1
Спасибо, это сработало для меня. Я пропускал идентификатор в течение нескольких месяцев, но после некоторых изменений в макете у меня начался этот сбой. Андроид странный.
Эриско
Вы отвечаете работает для меня. Мне просто интересно, почему я предполагаю поставить атрибут id, когда я его нигде не использую. Можешь мне объяснить?
Моши
12

Возможно, он вам больше не нужен, но если другие читатели сочтут это полезным. У меня точно такой же android.view.InflateException:...Error inflating class fragment. У меня были все нужные библиотеки включены. Решается добавлением еще одного пользовательского разрешения в AndroidManifest.xmlфайл, т.е.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Кстати, я бежал Android Studio 0.8.9 on Ubuntu 12.04.

Абу Шумон
источник
Работал на меня! Большое спасибо!
Дадан
12

У меня та же проблема, потому что я не реализовал слушателя. Смотрите следующий код с /*Add This!*/.

public class SomeActivity extends AppCompatActivity
        implements BlankFragment.OnFragmentInteractionListener /*Add this!*/ 
{
    @Override                                                  /*Add This!*/
    public void onFragmentInteraction(Uri uri){                /*Add This!*/
    }                                                          /*Add This!*/
}

К вашему сведению, мой класс фрагментов выглядит примерно так:

public class SomeFragment extends Fragment {

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }
}

Редактировать:

Я также замечаю то же самое сообщение об ошибке при других обстоятельствах, когда есть исключение в onCreateфункции Fragment. У меня есть что-то вроде следующего:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    int ID = getArguments().getInt("val");

    return rootView;
} 

Поскольку я повторно использую этот фрагмент, я полностью забываю установить аргументы. Тогда результат getArguments()есть null. Очевидно, я получаю nullисключение указателя здесь. Я предлагаю вам также следить за такими ошибками.

Ючен Чжун
источник
1
Спасибо! Это очень помогло!
DLee
8

Ваш NavigationDrawerFragment расширяет фрагмент android.support.v4.app.Fragment? Другими словами, вы импортируете правильный пакет?

import android.support.v4.app.Fragment;
Ван
источник
6

У меня тоже была эта проблема. Я решил это, заменив импорт в MainActivityиNavigationDrawerFragment

Из

import android.app.Activity;
import android.app.ActionBar;

к

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

Я обновил, MainActivityчтобы расширяет ActionBarActivityвместо активности

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Также используйте, ActionBar actionBar = getSupportActionBar();чтобы получить ActionBar

И я обновил следующую функцию в NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
источник
Я думаю, что это правильный ответ. Но я использовал AppCompatActivity вместо ActionBarActivity (не рекомендуется), а также не удаляю импорт android.app.ActionBar (как его использует метод onAttach)
GramThanos
6

Я столкнулся с этой проблемой и решил ее с помощью следующих кодов. Я начинал транзакцию фрагмента с помощью менеджера дочерних фрагментов.

расположение:

                  <fragment
                    class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
                    android:id="@+id/youtube_fragment"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

вот как я начал фрагмент транзакции:

   youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

следующие коды объясняют, как я удалил фрагмент, который был добавлен с помощью childfragmentmanger.

@Override
    public void onDestroyView() {
        super.onDestroyView();

        youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

        if (youTubePlayerFragment != null)
        {
            getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
        }

        youTubePlayer = null;
    }
Али Гюрелли
источник
TY Али. Ты спас мой день!
vm345
Работает отлично. Спасибо!
Поляриз
4

У меня были похожие проблемы вкл и выкл. Сообщение об ошибке часто содержит очень мало деталей, независимо от фактической причины. Но я нашел способ получить более полезную информацию. Оказывается, что внутренний класс android «LayoutInflater.java» (в пакете android.view) имеет метод «inflate», который повторно генерирует исключение, но не собирает детали, поэтому вы теряете информацию о причине.

Я использовал AndroidStudio и установил точку останова в строке 539 LayoutInflator (в версии, в которой я работаю), которая является первой строкой блока catch для общего исключения в этом методе «inflate»:

        } catch (Exception e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                            + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;

Если вы посмотрите на «e» в отладчике, вы увидите поле «причина». Это может быть очень полезно, давая вам подсказку о том, что действительно произошло. Так, например, я обнаружил, что родительский фрагмент включенного фрагмента должен иметь идентификатор, даже если он не используется в вашем коде. Или что у TextView была проблема с измерением.

Дейв Хаббард
источник
3

На всякий случай, если это кому-то нужно. Допущения: телефон устройства подключен к USB-кабелю и ваше чтение IDE для запуска приложения. Перейдите в командную строку, чтобы определить проблему: введите adb logcat

Затем запустите свое приложение из IDE. Вы будете исключением.

В моем случае: я развертывал приложение Android версии 2.3 на мобильное устройство, которое не поддерживало виджет «Космос».

al881
источник
3

Эта проблема возникает, когда у вас есть пользовательский класс, который расширяет другой класс (в данном случае представление) и не импортирует все конструкторы, требуемые классом.

Например: открытый класс CustomTextView расширяет TextView {}

Этот класс будет иметь 4 конструктора, и если вы пропустите один из них, он потерпит крах. На самом деле я пропустил последний, который использовал Lollipop, добавил этот конструктор и работал нормально.

Сагар Деванга
источник
2

мы также должны добавить следующее в build.gradle (приложение)

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

всякий раз, когда мы используем новые макеты или новые конструктивные особенности. надеюсь, это поможет вам.

Ума Аханта
источник
2

Как уже упоминалось в предыдущем посте,
переименуйте

android:name="com.fragment.NavigationDrawerFragment"

в

class = "com.fragment.NavigationDrawerFragment"

Тем не менее, это не сработало для меня. Затем я просто использовал имя класса без части com.fragment и вуаля это сработало. Так что измените это наконец

class = "NavigationDrawerFragment"
на запад
источник
2

После того, как ни один из ответов здесь не помог мне, я решил запустить приложение в режиме отладки, перемещаясь по каждой строке onCreateView в моем фрагменте (NavigationDrawerFragment в вашем случае). И заметил, что у фрагмента были проблемы с надуванием из-за исключения NullPointerException. Например

mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);

Здесь mySeekBar был установлен в null (потому что я пропустил добавление элемента управления в соответствующем макете), и следующая строка попала в NPE, которая появилась как InflateException. Также, как предложено выше, переименуйте Android: имя в класс.

Эта проблема может возникнуть по разным причинам, указанным выше. Я бы порекомендовал построчную отладку, чтобы узнать, что не так.

Vishy
источник
И была ли эта ошибка в onCreateView()методе фрагмента ?
LarsH
1

Для некоторых из вас, которые до сих пор не нашли решения для этого, в моем случае это происходило из-за проблемы с OOM (Out of Memory). Это может произойти, если у вас, например, есть утечка памяти в приложении при длительном использовании. В моей трассировке стека это было главной причиной.

Сэм Беллероз
источник
1

Я не знаю, поможет ли это.

У меня была эта проблема с TextView, который у меня был в макете, который я пытался надуть ( android.view.InflateException: строка двоичного XML-файла # 45: Ошибка надувания класса TextView ).

Я установил следующий атрибут XML android: textSize = "? Android: attr / textAppearanceLarge", который не позволял раздувать макет.

Не знаю точно, почему, ( я все еще немного новичок в Android - менее года опыта ), может иметь какое-то отношение к вызову системных атрибутов, idk, все, что я знаю, это как только я использовал обычный старый @ измерение / md_text_16sp ( который является моим обычаем ), проблема решена :)

Надеюсь это поможет...

tl_
источник
У меня не было ни фрагментов, ни атрибута textSize android. Моя ошибка была связана с TextInputLayout с пользовательским стилем, наследующим TextAppearance.AppCompat вместо Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/…
Младший Mayhé
1

У меня было это на устройстве 4.4.2, но 5+ было хорошо. Причина: внутри инициализации пользовательского представления я создавал TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)API 21+.

Android Studio 2.1 не жалуется на это, даже если это аннотировано TargetApi(21). По-видимому, Android Studio 2.2 исправит это и правильно покажет это как ошибку.

Надеюсь, это кому-нибудь поможет.

Том
источник
1

Я немного опоздал на вечеринку, но ни один из этих ответов не помог мне в моем случае. Я использовал карту Google в качестве SupportMapFragment и PlaceAutocompleteFragment в моем фрагменте. Поскольку все ответы указывают на тот факт, что проблема в том, что SupportMapFragment является картой, которая должна быть воссоздана и перерисована.

Но у меня также была проблема с PlaceAutocompleteFragment. Итак, вот рабочее решение для тех, кто сталкивается с этой проблемой из-за SupportMapFragment и SupportMapFragment

 mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    FragmentManager fm = getChildFragmentManager();

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
        fm.executePendingTransactions();
    }

    mapFragment.getMapAsync(this);

    //Global PlaceAutocompleteFragment autocompleteFragment;


    if (autocompleteFragment == null) {
        autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);

    }

И в onDestroyView очистите SupportMapFragment и SupportMapFragment

@Override
public void onDestroyView() {
    super.onDestroyView();


    if (getActivity() != null) {
        Log.e("res","place dlted");
        android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(autocompleteFragment);
        fragmentTransaction.commit();

        autocompleteFragment = null;
    }


}
Ратул Бин Тазул
источник
1

После долгих попыток я решил проблему так, как не смог ответить ни один из приведенных выше ответов.

  1. Расширьте AppCompatActivityсвою Mainдеятельность вместо Activity.
  2. Добавьте android:theme="@style/Theme.AppCompat.Light"к вашему <Activity..../>вAndroidManifest.xml
  3. В своем NavigationDrawerFragmentклассе измените свои ActionBarэкземпляры на

    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();

РЕДАКТИРОВАТЬ

Это должно быть соответствие между деятельностью и макетом . Если макет имеет одну из тем AppCompat , например Theme.AppCompat.Light, ваша активность должна extends AppCompatActivity.

Я хотел иметь значок гамбургера и навигационный ящик, который выглядит как приложение Android Gmail , но в итоге я получил уродливый навигационный ящик . Все это потому, что все мои классы extends Activityвместо AppCompatActivity.

Я пересмотрел весь проект, чтобы расширить его AppCompatActivity, затем щелкнуть правой кнопкой мыши Layout Folder, выбрать new-> Activityзатем Navigation Drawer Activityи Boom, все для меня сделано!

Яхья
источник
1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

Представление может быть чем угодно, что не может быть раздутым, такая ошибка возникает, когда возникает конфликт в разрешении имен классов или атрибута имени представления, указанного в файле XML.

Когда я получаю ту же ошибку, я просто получил все чистое и безопасное в файле UI-XML, представление, которое я использовал,

   <com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:hideOnScroll="true"
    app:menu="@menu/bottom_app_bar"
    app:navigationIcon="@drawable/ic__menu_24"/>

Я использовал атрибут стиля, который ссылался на свойство компонентов материала. Но мой файл styles.xml ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

Где класс решал столкновение с конфликтом. Мои атрибуты просмотра ссылались на свойство, которое не было определено в теме моего приложения. Правильная родительская тема из материальных компонентов помогла мне. Поэтому я изменил родительский атрибут на ...

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

Который решил проблему.

Шринивас Манджитая
источник
0

Я думаю, что основная проблема связана с «android: targetSdkVersion», который определен в AndroidManifest.xml. В моем случае начальное значение, которое я определил как:

android:targetSdkVersion=16

Я изменил это на:

android:targetSdkVersion=22

что решило все мои ошибки. Таким образом, установка правильного «targetSdkVersion» также важна перед созданием приложения для Android.

Санджив
источник
0

В случае, если кто-то еще приходит сюда и ответы не помогают решить проблему, нужно попробовать еще одну вещь.

Как уже упоминали другие, это обычно вызвано проблемой, вложенной в сам XML, а не тем, что вы сделали неправильно в вашей Java. В моем случае это было очень легко (и глупо) исправить.

У меня был такой код:

<view
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:id="@+id/view44"
    android:background="@color/gray"
    />

Когда все, что мне нужно было сделать, это сделать прописными букву v в «View», чтобы система распознала его. Убедитесь, что все ваши пользовательские представления (или фрагменты, виды повторного использования и т. Д.) Имеют правильную заглавную декларацию, чтобы автозаполнение XML соответствовало соответствующему представлению.

PGMacDesign
источник
0

У меня тоже была эта ошибка, и после очень долгой отладки проблема выглядела так, что мой MainClass расширил Activity вместо FrameActivity, в моем случае xml не был проблемой. Надеюсь помочь вам.

Copacel
источник
0

В моем случае .

План, который я пытался надуть, имел

<include 
 layout  = "...."
/>

тег, удалив это исправил это.

Я пытался надуть предыдущий макет, разработанный для Actvity, в адаптер пейджера.

mughil
источник
0

Моя ошибка была вызвана другой проблемой.

Я передавал связку из Деятельности в ее фрагмент. Когда я прокомментировал код, получающий пакет во фрагменте, ошибка исчезла. Как оказалось, моя ошибка была из-за нижеприведенного "getArguments ();" часть, которая возвращала ноль.

Bundle args = getArguments();

После проверки кода отправки Activity я понял, что допустил глупую ошибку в следующем;

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 FragmentManager fragmentManager = getSupportFragmentManager();
 --> fragmentManager.beginTransaction()
                        .replace(R.id.container, new  MainActivityFragment(),
                                DetailRecipeActivityFragment.TAG)
                        .commit();

Я создавал новый фрагмент в строке со стрелкой. Принимая во внимание, что я должен был использовать предварительно созданный фрагмент, который уже имел мою связку. Так и должно было быть:

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 Fragment mainFragment = new MainActivityFragment();
 FragmentManager fragmentManager = getSupportFragmentManager();
 -->fragmentManager.beginTransaction()
                        .replace(R.id.container, mainFragment,
                                DetailRecipeActivityFragment.TAG)
                        .commit();

Я не знаю, почему именно он выдает эту ошибку вместо NPE, но это решило мою ошибку в случае, если у кого-то такой же сценарий

Amgad
источник
0

У меня была такая же проблема, в моем случае имя пакета было неправильным, исправление решило проблему.

Tincho825
источник
0

У меня была эта ошибка, когда у меня был RecyclerView в корне моего фрагмента. Xml,

но когда я обернул его с помощью ViewGroup, приложение работало нормально.

7odafarghal
источник
0

Добавьте это поле имени в навигацию

андроид: имя = "androidx.navigation.fragment.NavHostFragment"

   <fragment
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:name="androidx.navigation.fragment.NavHostFragment"
             app:navGraph="@navigation/navigation"
             app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
             app:layout_constraintTop_toTopOf="parent">
джай хамбхайта
источник