android.view.InflateException: Бінарний XML-файл: Помилка завищення фрагмента класу


151

У мене дуже неприємна помилка, яку я не можу пояснити. Я створив додаток 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)

Скажіть, будь ласка, як виправити помилку, дякую :)


1
У цьому рядку ви отримуєте виняток, перевіряйте, чи правильно вказано ім'я класу та ім'я пакету. Android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs

1
я перевірив, і цей клас правдивий. Я можу компілювати та запускати на деяких пристроях, але не Samsung s3. Я думаю, що тут є деякі дивні проблеми :(
hqt

Ви маєте рацію, якщо це виконується на якомусь пристрої, а не на s3 - це дивна проблема .. мій рада один раз спробувати використати sherlacFragment chek один раз ..
kalyan pvs

Я вже вирішив тут питання: 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" />

Сподіваюся, що це допоможе :)


4
Я зіткнувся з цим питанням, намагаючись дотримуватися офіційного підручника Android. Ваше виправлення (зміна android:idв class) працював для мене. Я також отримав попередження Lint для зміни Fragmentдо fragment, що я і зробив.
stevepastelan

9
@DownVoter: ця помилка заплутана. І я, на щастя, знайду спосіб виправити. Мені дуже шкода, якщо моя публікація не може виправити вашу помилку, тому що я також не можу пояснити, чому. Але я вважаю, що він не повинен отримувати голосування проти. :)
hqt

2
Цікаво, якщо ви отримали цю аварію надійно, не переходячи nameна class, у мене було декілька користувачів, які повідомляють про цю аварію, але я не можу сама спростити це!
Даніель Вілсон

8
Не працює для мене. Я так втомилася. 2 години розробника і не можете знайти, чому це не працює (рядок файлів бінарних файлів xml ... помилка, надуваючи фрагмент класу). Будь-яка ідея?
Кокоріко

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()потрібно зробити, і в цьому випадку робити це для кожного класу фрагментів, який використовується в макеті, який спричинив проблему. Наприклад, у випадку з ОП був код програми, де стався виняток

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, але використовує інший підхід для пошуку першопричини (ведення журналу проти відладчика).


2
Ви, ймовірно, врятували мені години налагодження. Кудо!
Szymon Sadło

16

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

Отже, у 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
Дякую, це працювало для мене. Я пропускав ідентифікатор місяцями, але після деяких змін компоновки раптом у мене почався цей збій. Android дивний.
еріско

Ви відповідаєте, працює для мене. Мені просто цікаво, чому я вважаю, що слід ставити атрибут 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!*/
}

FYI, мій клас фрагментів виглядає приблизно так:

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 андроїд.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();
}

Я думаю, що це правильна відповідь. Але я використав 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 Ali. Ти врятував мені день!
vm345

Добре працює. Дякую!
Поляріз

4

У мене були подібні проблеми і вимикалися. Повідомлення про помилку часто містить дуже мало деталей, незалежно від фактичної причини. Але я знайшов спосіб отримати більш корисну інформацію. Виявляється, у внутрішньому андроїд-класі "LayoutInflater.java" (в пакеті android.view) є метод "надути", який повторно кидає виняток, але не збирає деталі, тому ви втрачаєте інформацію про причину.

Я використав AndroidStudio і встановив точку розриву в рядку 539 LayoutInflator (у версії, в якій я працюю), що є першим рядком блоку вилову для загального винятку в тому методі "надуття":

        } 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 на мобільний пристрій, який не підтримував віджет "Пробіл"


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 був встановлений на нуль (тому що я пропустив додавання елемента керування у відповідний макет), і наступний рядок потрапив до NPE, який вийшов як InflateException. Також, як було запропоновано вище, перейменуйте android: name в клас.

Це питання може виникати з різних згаданих вище причин. Я б порекомендував потік налагодження по черзі, щоб знати, що не так.


І чи була ця помилка в onCreateView()методі фрагмента ?
LarsH

1

Для деяких із вас, які досі не знайшли рішення для цього, у моєму випадку це сталося тому, що у мене виникла проблема OOM (Out of Memory). Це може статися, коли у вашому додатку, наприклад, витік пам’яті при тривалому використанні. За моїм стеком, це була основна причина.


1

Я не знаю, чи це допоможе.

У мене була ця проблема з TextView, який я мав у макеті, який я намагався надути ( android.view.InflateException: Рядок файлів бінарного файлу XML №45: Помилка накачування класу TextView ).

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

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

Сподіваюся, це допомагає ...


У мене не було ні фрагментів, ні атрибута андроїда textSize. Моя помилка була пов’язана з 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();

EDIT

Це має бути узгодженість між активністю та макетом . Якщо у макеті є така тема 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"/>

Я використовував атрибут стилю, який посилався на властивість компонентів Material. Але мій 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 у «Вид», щоб система розпізнала її. Перевірте, чи всі ваші власні представлення даних (або фрагменти, перегляд рециркуляторів тощо) мають правильну величину з великої літери заявки на передній панелі, щоб автоматичне завершення XML відповідало відповідному виду.


0

У мене була і ця помилка, і після дуже довгої налагодження проблема виявилася тим, що мій MainClass розширив активність замість FrameActivity, у моєму випадку xml не була проблемою. Сподіваюся, що вам допоможуть.


0

У моєму випадку.

Макет, який я намагався надути, мав

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

тег, видаливши його виправити.

Я намагався надути попередній макет, розроблений для Actvity, в адаптер програмного забезпечення для перегляду.


0

Моя помилка була викликана іншою проблемою.

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

Bundle args = getArguments();

Перевіривши код надсилання активності, я зрозумів, що в думках помилково помилка нижче

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, але це вирішило мою помилку, якщо хтось має той самий сценарій


0

У мене була така ж проблема, у моєму випадку назва пакета була неправильною, виправлення це вирішило проблему.



0

У мене виникла помилка, коли мій RecyclerView був у корені фрагмента.xml,

але коли я завернув її з ViewGroup, додаток працював чудово.


0

Додайте це поле імені в навігацію

android: name = "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">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.