Помилка надування фрагмента класу


161

Я отримую Помилку

Unable to start activity ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment

коли я перемикаюсь через портретний та альбомний режим. Я використовую фрагменти. Мій xml:

 <LinearLayout android:id="@+id/mainLayout"
               android:orientation="horizontal"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" >

    <ListView android:id="@+id/android:list"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"/> 

    <fragment android:id="@+id/fragmentDetails"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
</LinearLayout>

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

06-21 14:55:05.600: ERROR/AndroidRuntime(7636): FATAL EXCEPTION: main
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): java.lang.RuntimeException: Unable to start activity         
ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}:   android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3097)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.access$1600(ActivityThread.java:123)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:997)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Looper.loop(Looper.java:126)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.main(ActivityThread.java:3998)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invokeNative(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invoke(Method.java:491)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at dalvik.system.NativeStart.main(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:227)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Activity.setContentView(Activity.java:1771)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at de.androidbuch.activiti.task.TaskActivity.onCreate(TaskActivity.java:83)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     ... 12 more

Чи зберігаєте окремі файли компонування у папках макета та папці макета?
Натан Фіг

Чи можете ви надати повний журнал помилок, включаючи рядки після "Неможливо розпочати діяльність ..."
Дейв,

@Nathan Fig: так, я роблю .. але отримання помилок ..
tsync

@Dave: ось ти .. будь-яка ідея?
цинк

Вам потрібен код ландшафтного макета, а також корисними будуть ваші дзвінки до setContentView, а також те, як ви знімаєте активність у портретному режимі, як я припускаю, що ви є. На даний момент, здається, недостатньо інформації. Перегляд прикладу FragmentLayout в демонстраційних програмах API може допомогти вам, як здається, ви робите щось подібне.
PJL

Відповіді:


131

Як сказав hdemirchian, обов'язково використовуйте:

import android.support.v4.app.Fragment;

А також переконайтеся, що активність, яка використовує фрагменти (фрагменти), поширюється FragmentActivityзамість регулярної Activity,

import android.support.v4.app.FragmentActivity;

щоб отримати FragmentActivityклас.


12
Це було сприйнято дуже багато, але для мене воно припиняється під час відновлення програми, і я вже використовую v4 Fragment та v4 FrsgmentActivity - щоб бути точнішим AppCompatActivity.
Йозеф

4
Це не рішення. імпортувати android.support.v4.app.Fragment; нічого не змінює. Насправді це навіть невикористаний та непотрібний імпорт.
f470071

7
Дякую, сторона зауважує, що AppCompatActivity є нащадком FragmentActivity.
abedfar

але я використовую фрагмент кинджала, і фрагмент кинджалу завжди розширює фрагмент, а не активність фрагмента
user3475052

96

Виняток android.view.InflateException: Binary XML file line: #... Error inflating class fragmentможе статися, якщо ви маніпулюєте getActivity()всередині фрагмента, перш ніж onActivityCreated()викликати. У такому випадку ви отримуєте неправильну посилання на активність і не можете на це покладатися.

Наприклад, наступний шаблон невірний:

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

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...); - another problem: button is null

    return view;
}

Правильний візерунок №1

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

    Button button = view.findViewById(R.id...);
    button.setOnClickListener(...);

    return view;
}

Правильний візерунок №2

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}

@MaximKorobov Ви можете зателефонувати getActivity()всередину onActivityCreated()або в будь-який наступний спосіб життєвого циклу, але раніше onDestroyView().
Григорій А.

Велике спасибі, це надзвичайно допомогло!
Shotgun Ninja

Дякую :-), це заощадило мені багато часу :)
користувач1007522

Я хотів би дізнатися більше про це, мені трапляються спорадичні збої, і я думаю, що це може бути проблемою. Хоча більшість часу код працює добре, тому важко дізнатися
Даніель Вілсон,

Модель 2 могла вирішити це для мене. Схрещені пальці. Дякую за це.
Йозеф

53

36

У мене була така ж помилка. Я копав цілий день, не знаю, але я думаю, що я спробував ~ 25 рішень щодо цієї проблеми. Жоден не працював, поки о 2:00 я не дізнався, що цей рядок відсутній у маніфесті програм xml:

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

Цей рядок був всередині <application>тегу. Я дуже сподіваюся, що це комусь допомагає. ГЛ.


3
Мій герой. Такі люди, як ти, так чудово роблять!
капдрагон

5
Поясніть, що відбувається, будь ласка. Яка користь від цієї лінії?
Мансур Фахад

2
Спасибі, врятуй мені день. Кожен зразок використання карти Google на андроїді працює по-різному, мені цікаво, чи є стандарт.
користувач2812866

22

У мене була така ж проблема. Для мене було рішенням порядку super.onCreate і setContentView у FragmentActivity

Наступне замовлення працює чудово:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);

3
Чому це виправляється?
Спенсер

1
У методі JAVA superзавжди потрібно викликати на початку методу.
Stéphane Bruckert

11
@ StéphaneBruckert, це не завжди super.method()має бути викликано першим. Це залежить від того, що робить метод суперкласу. У випадку з FragmentActivityцим робиться деяка ініціалізація, необхідна для setContentViewправильної роботи. Однак в іншому методі (скажімо onKeyUp) ви можете умовно виконати деяку роботу з дією, але відмовитися від цього, super.onKeyUpу цьому випадку, ви, швидше за все, захочете зателефонувати super.onKeyUpв самому кінці функції.
CoatedMoose

Напевно, також варто відзначити, що super()(конструктор суперкласу) має бути першою функцією, яка викликається в будь-якому конструкторі дочірніх класів, однак називати її не обов'язково обов'язково (це повністю залежатиме від розширеного класу).
CoatedMoose

17

Фрагменти не можна вкладати в XML

Навчився цього важким способом - якщо ви вкладете <fragment>тег на основі макета XML всередині (потенційно) фрагмента FragmentManager, що динамічно завантажений , тоді ви починаєте отримувати дивні помилки, намагаючись роздути ваш XML фрагмент.

Виявляється, що це не підтримується - це буде добре, якщо зробити це за допомогою чисто FragmentManagerпідходу.

У мене виникла ця проблема, оскільки я намагався завантажити фрагмент всередині <DrawerLayout>xml, і це спричинило збій у onCreateView()методі, коли я вискочив задній стек.


Це все ще не підтримується? Станом наappcompat-v7:23.3.0
thanassis

так, я вкладаю фрагмент всередині xml. Я розберуся в цьому.
KDeogharkar

Але існують рішення / хаки для проблеми: stackoverflow.com/a/14695397/860488
Morten Holmgaard

2
Див. Примітку в кінці цього розділу для підтвердження: developer.android.com/about/versions/…
Філіп

не впевнений, чому рішення настільки просте. для мене, просто замінивши <fragment>на <frameLayout>відпрацьований. Я все ще з’ясовую це. - stackoverflow.com/a/19167009/5477548
yoad ж

16

У мене була така ж проблема, як і у вас. Жодна порада зверху мені не допомогла. Пізніше я виявив, що все, що мені потрібно було, - це виправити імпорт з:

import android.app.Fragment;

до:

import android.support.v4.app.Fragment;

Дякую, це рішення спрацювало і для мене. Я боровся з цим питанням 2 дні. Нарешті ваше рішення працювало me.thanks hdemirchian ..
Лакшманана

Ти надзвичайний! Моя проблема була протилежною - майстер фрагментів імпортує android.support.v4.app.Fragment за замовчуванням. І моя основна діяльність розширює android.app.Activity.
Freak Industrial Control Freak

12

Ти намагався:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

1
Ви показали нам 1 xml файл, але у вас повинен бути 2 в / layout / і один у layout-land /
Блондел

12

Переконайтесь, що в методі onCreateView фрагмента не виняток. Якщо в цьому методі порушено будь-яке виняток, logcat не відображатиме точних деталей винятку, натомість він завжди показує повідомлення:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.fragment" 
on path: DexPathList[[zip file "/data/app/com.package/base.apk"],
nativeLibraryDirectories=[/data/app/com.package/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

Для того, щоб додати те, про що говорить Лей, поставте спробу наздогнати код всередині вашого oncreateview і з’ясувати фактичну першопричину. Дякую Лей!
Swaroop

6

Якщо ваше TaskDetailsFragmentрозширення android.app.Fragment, внесіть зміни onCreateView().

Поверніть свій погляд, який ви хочете показати у Фрагменті, або перетворіть ваш макет для перегляду за допомогою LayoutInflater та поверніть його.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mainview = inflater.inflate(R.layout.main, null);
    return mainview;
}

Сподіваюся, це працює. :)


6

Перевірте шлях до класу, може бути, що інфлятор перегляду не може знайти визначення вашого класу, як визначено у вашому xml class = "de.androidbuch.activiti.task.TaskDetailsFragment", наведений вище шлях може бути неправильним.


6

Я отримував цю помилку з різних причин.

Кроки до відтворення:

~> Моя проблема полягала в тому, що я створив абсолютно новий пустий додаток.

~> Потім я створив спеціальний фрагмент з меню Файл ~> Новий файл.

~> Налаштували фрагмент, додавши макети та кнопки тощо.

~> Посилається на новий користувацький фрагмент у автоматично створеному для мене Activity_my.xml, створеному для мене під час створення програми. Це дозволило XML генерувати об'єкти для мене.

Тут є привід при генерації користувацького фрагмента через Файл ~> Нове меню файлу, він автоматично генерує заглушку функції інтерфейсу та розміщує її внизу файла класу фрагмента.

Це означає, що ваш клас MyActivity повинен реалізувати цей інтерфейс. Якщо цього не відбувається, зазначена вище помилка виникає лише при посиланні на фрагмент з xml. Повністю видаляючи посилання на Фрагмент у XML та створюючи фрагмент через код у файлі класу MyActivity.java, Logcat створює більш стисну помилку, яка детально пояснює проблему та скаржиться на інтерфейс. Це продемонстровано у «Діянні шаблону проекту + фрагмент». Хоча, <~ цей шаблон проекту не генерує заглушку інтерфейсу.


5

Для мене це було після прокрутки в сліді стека, я виявив, що у них немає дозволу на android.permission.ACCESS_NETWORK_STATE

після додавання цього дозволу його було виправлено


1
Не для себе: "прокручуйте весь слід стека. Дякую @Gil.
Batandwa

4

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

Коли ви отримуєте помилку, чи лише тоді, коли ви клацаєте елемент в альбомному режимі, або лише в портретному режимі або те й інше? Чи використовується у вашій роботі TaskDetailsFragment файл макета, який може мати розбіжності між пейзажним та портретним режимами?


Дякую за вашу відповідь .. ну у мене є лише фрагмент в альбомному режимі, а не в портретному режимі. Тож я можу натиснути лише в альбомному режимі, щоб побачити фрагмент. І після переходу знову в ландшафтний режим я отримую цю помилку ...
tsync

Це майже напевно проблема - у вас є перегляд у портретному режимі, який не можна знайти в альбомному режимі. Чи додає фрагмент до пейзажу виправити проблему?
Натан Фіг

1
Ви можете мати представлення даних, які не існують в обох файлах - у цьому вся суть роздільної макети -land та -port. Однак перевірте ідентифікатори. У моєму портретному файлі ідентифікатор відсутній, і ця помилка отримувалась під час перемикання.
maxpolun

4

Якщо ви додаєте Fragmentстатично, тобто в xml, то, можливо, ви пропустили реалізувати OnFragmentInteractionListenerу своєму Activityкласі. Тоді реалізація інтерфейсу вирішила б проблему. Якщо ви додаєте Fragmentдинамічно, тобто в клас java, то це не є рішенням. Оскільки IDE сам по собі не дозволить вам продовжувати роботу без впровадження необхідних інтерфейсів.


3

Моєю проблемою в цьому випадку був простий випадок наявності тупого виключення нульового вказівника в одному з моїх методів, на який посилався пізніше в життєвому циклі. Це викликало для мене виняток "Помилка надування фрагмента класу". Якщо коротко, будь ласка, пам’ятайте, щоб перевірити подальше слідування стека винятків на можливу причину.

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


3

Жодне із згаданих рішень мені не допомогло. У журналі я міг знайти детальну інформацію про виняток, як згадувалося нижче:

06-19 16:20:37.885: E/AndroidRuntime(23973): Caused by: java.lang.RuntimeException: API key not found.  Check that /meta-data/ android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/ is in the application element of AndroidManifest.xml.

Я зробив це, і мій код працював!

<meta-data  android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCl1yGPZ3mpxxxxxxxAz2R-t7zcWVzrHUL9k"/>
</application>

3

Якщо ви не хочете нічого змінювати, перейдіть з тегом " фрагмент "

зробити це,

<fragment
 android:visibility="gone" (Visibility will not work, just helps in removing frag from xml viewer)(If you want the visibility to be gone make it in your fragment root element visibility=gone)
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:name="com.example.YOUR_FRAGMENT" (This is important)
 />

2

Мав той самий тип помилки, де точно відображалося те саме повідомлення про помилку в logcat. Мені потрібно було внести зміни в шлях збірки Java, розташований під Project->Properties. Я включив відповідні бібліотеки Google Maps, як android-support-v4.jarі google-play-services.jar; однак я бракував, включаючи ці 'Build class path'в 'Order and Export'меню опцій. Можливо, тут криється помилка.

Спробуйте включити бібліотеки до шляху складання класу.

Порядок побудови класів також може викликати помилку, тому моя порада також спробувати змінити порядок шляху будівництва. Помилка зникла , коли я використовував наступний порядок: 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'. Останній блок містить файли jar, згадані раніше.


1

У своєму XML-файлі просто використовуйте замість тегу. Надувальник намагається створити android.app.Fragment, з якого не вдасться в API <10. Отже, вам потрібно створити групу перегляду іншого типу.



1

переконайтесь, що ти використав цей

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyBEwmfL0GaZmdVqdTxxxxxxxx-rVgvY" />

не це..

<meta-data 
         android:name="com.google.android.gms.version" 
          android:value="AIzaSyBEwmfL0GaZmdVqdTCvxxxxxxx-rVgvY" /> 

1

Просто була ця сама помилка. Причиною для мене стала видимість мого фрагмента класу. Він був встановлений за замовчуванням, повинен бути загальнодоступним.


1

Чи можете ви опублікувати фрагмент onCreateта onCreateViewметоди? У мене був такий самий виняток, який був викликаний винятком у onCreateметоді фрагмента , коли я виправив цю проблему, він виправив фрагмент класу Помилка, що надуває.


1

Я отримував цю помилку в андроїд-студії. Проблема полягала в тому, що мій фрагмент мав відносну компоновку, тоді як код функції OnCreateView був

mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);

ваш код робить те саме?


1

Якщо ви хочете успадкувати AppCompatActivity , ви можете зробити щось подібне. У xml діяльності використовуйте FrameLayout, як це-

<FrameLayout
    android:id="@+id/result_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/progress_frame"/>

а в діяльності onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();

Завдяки цьому допомогло. Не впевнений, чому мені вдалося успішно використовувати <fragment> в моєму макеті в інших додатках, над якими я працював, але тут він не працював!
SingularityFuture

лише зауважте, це може спрацювати, але це зазвичай для динамічних фрагментів, не статичних
Таннер Саммерс

1

Я отримав таку ж помилку, але моя проблема полягала в тому, що мій фрагмент не мав ідентифікатора в xml-макеті батьківської діяльності.


1

Після одноденної боротьби я знайшов деяку перевірку сценарію, можливо, ви зіткнулися з тим же,

Якщо все прокидається так само, як код Google, то, будь ласка, перевірте файл маніфесту, у моєму випадку я додав гео ключ та ключ карти, тому відбувається виняток,

Примітка - не додайте дві клавіші в файл маніфесту видалення ключа

meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key"/>

вище коду та додайте цей код.

 <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/auto_location"/>

 <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

1

У мене була подібна проблема; після запуску прикладу AdMob я спробував вставити оголошення у свій додаток, що спричинило цю помилку:

01-02 16:48:51.269    8199-8199/it.dndc.BreathPlot E/AndroidRuntime FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
 Caused by: android.view.InflateException: Binary XML file line #57: Error inflating class fragment

Рішення полягає в тому, що ви не можете вставити фрагмент для оголошення в ListActivity. Натомість я можу без проблем додати його до FragmentActivity та ActionBarActivity.

Моя пропозиція: почніть з прикладу AdMob і додайте в нього своє існуюче додаток: я б заощадив багато часу !!!


1

Якщо ви використовуєте обфускування з компонентом навігації, вам потрібно виключити фрагмент андроїда та ваші аргументи. Додайте ці рядки до файлів правил-захистів:

# Exclude the fragments and argType for navigation component.
-keep class * extends androidx.fragment.app.Fragment{}
-keep class com.safetonet.presentation.features.parent.adddevice.model.PresentableAddDeviceData
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.