Ошибка надувания фрагмента класса

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
TSYNC
источник
Вы храните отдельные файлы макетов в папках макетов и макетов?
Натан Фиг
Можете ли вы предоставить полный журнал ошибок, включая строки после «Невозможно начать действие ...»
Дейв
@ Натан Рис: да, я делаю .. но получаю ошибки ..
tsync
@ Дейв: здесь вы идете .. есть идеи?
tsync
Вам понадобится код компоновки ландшафта, а также полезными будут ваши вызовы 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
Это не решение. import android.support.v4.app.Fragment; ничего не меняет. На самом деле это даже неиспользованный и ненужный импорт.
f470071
7
Спасибо, примечание, что AppCompatActivity является потомком FragmentActivity.
Абедфар
но я использую фрагмент кинжала, и фрагмент кинжала всегда расширяет фрагмент, а не активность фрагмента
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().
Григорий А.
Большое спасибо, это очень помогло!
Дробовик ниндзя
Спасибо :-) это сэкономило мне много времени :)
user1007522
Я хотел бы узнать больше об этом, я получаю спорадическую аварию, и я думаю, что это может быть проблемой. Хотя большую часть времени код работает нормально, так что это трудно понять
Даниэль Уилсон,
Шаблон 2, возможно, решил это для меня. Скрещенные пальцы. Спасибо за это.
Джозеф
53

Убедитесь, что ваш Activityрасширяет FragmentActivity.

Джеймс
источник
36

У меня была такая же ошибка. Я копал весь день, не знаю, но я думаю, что попробовал ~ 25 решений по этой проблеме. Ничего не работало, пока в 2 часа ночи я не узнал, что мне не хватает этой строки в xml-файле приложения:

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

Эта строка была внутри <application>тега. Я очень надеюсь, что это поможет кому-то. GL.

Матисс
источник
3
Мой герой. Такие люди, как вы, делают НАСТОЛЬКО великих!
Капдрагон
5
Объясните, что происходит, пожалуйста. В чем выгода этой линии?
Мансур Фахад
2
Спасибо, спаси мой день. Каждый пример использования карты Google на Android работает по-разному, интересно, есть ли стандарт.
user2812866
22

У меня такая же проблема. Решением для меня был порядок super.onCreate и setContentView в FragmentActivity

Следующий заказ работает нормально:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);
Wilko
источник
3
Почему это исправить?
Спенсер
1
В методе JAVA superвсегда должен вызываться в начале метода.
Стефан Брукерт
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
тасси
да я вложенный фрагмент внутри XML. Я посмотрю на это.
KDeogharkar
Но существуют решения / хаки для этой проблемы: stackoverflow.com/a/14695397/860488
Мортен Холмгаард
2
См. Примечание в конце этого раздела для подтверждения: developer.android.com/about/versions/…
Филипп
не уверен, почему решение так просто. для меня, просто заменить <fragment>с <frameLayout>работал. Я все еще понимаю это. - stackoverflow.com/a/19167009/5477548
йоад
16

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

import android.app.Fragment;

чтобы:

import android.support.v4.app.Fragment;
hdemirchian
источник
Спасибо, это решение работает для меня тоже. Я боролся с этой проблемой в течение 2 дней. Наконец, ваше решение сработало для меня. Спасибо hdemirchian ..
Лакшманан
Ты обалденный! Моя проблема была противоположной - мастер фрагментов импортирует android.support.v4.app.Fragment по умолчанию. И моя основная деятельность расширяет android.app.Activity.
Промышленный контроль урод
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 /
Blundell
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 сгенерировать объекты для меня.

Вот ловушка при генерации пользовательского фрагмента через File ~> New File Menu, он автоматически генерирует заглушку функции интерфейса и помещает ее в конец файла класса фрагмента.

Это означает, что ваш класс MyActivity должен реализовывать этот интерфейс. Если это не так, то вышеупомянутая ошибка возникает только при ссылке на фрагмент из XML. При полном удалении ссылки на фрагмент в XML и создании фрагмента с помощью кода в файле класса MyActivity.java Logcat генерирует более краткую ошибку, подробно объясняющую проблему и жалующуюся на интерфейс. Это продемонстрировано в шаблоне проекта «Деятельность + фрагмент». Хотя <~ этот шаблон проекта не генерирует заглушку интерфейса.

xMythicx
источник
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

В этом случае моей проблемой был простой случай, когда в одном из моих методов вызывалось исключение из-за тупого нулевого указателя, которое вызывалось позже в жизненном цикле. Это вызывало у меня исключение «Ошибка раздувания фрагмента класса». Короче говоря, не забудьте проверить дальнейшую трассировку стека исключений для возможной причины.

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

oddmeter
источник
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>
Khushboo
источник
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 Build Path, расположенный в 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" /> 
DJP
источник
1

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

southerton
источник
1

Не могли бы вы опубликовать фрагмент onCreateи onCreateViewметоды? У меня было точно такое же исключение, которое было вызвано исключением в onCreateметоде фрагмента , когда я исправил эту проблему, он исправил ошибку, надувающую фрагмент класса.

AdamVe
источник
1

Я получал эту ошибку в Android Studio, проблема была в том, что мой фрагмент имел относительное расположение, в то время как код функции 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();
Вайбхав Шарма
источник
Спасибо, это помогло. Не уверен, почему мне удалось успешно использовать <фрагмент> в моем макете в других приложениях, над которыми я работал, но здесь это не сработало!
SingularityFuture
просто отметьте, что это может работать, но это обычно для динамических фрагментов, не статичных
Таннер Саммерс
1

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

stevethecollier
источник
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 и добавьте в него свое существующее приложение: я бы сэкономил много времени !!!

user2270629
источник
1

Если вы используете обфускацию с компонентом Навигация, вам нужно исключить фрагмент Android и ваши аргументы. Добавьте эти строки в ваши файлы proguard-rules:

# 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
user3193413
источник