it-swarm.com.ru

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

Я получаю ошибку 

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
142
tsync

Как сказал hdemirchian, обязательно используйте:

import Android.support.v4.app.Fragment;

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

import Android.support.v4.app.FragmentActivity;

чтобы получить класс FragmentActivity

121
Dandre Allison

Исключение 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(...);
}
88
Grigori A.

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

52
binnyb

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

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

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

30
Matiss Jurgelis

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

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

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

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

import Android.app.Fragment;

чтобы:

import Android.support.v4.app.Fragment;
16
hdemirchian

Фрагменты не могут быть вложены в XML

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

Оказывается, что это не поддерживается - это будет работать нормально, если вы сделаете это с помощью чисто FragmentManager подхода.

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

16
Dhiraj Gupta

Убедитесь, что в методе 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)
12
Lei

Ты пытался:

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

Если ваш TaskDetailsFragment расширяет Android.app.Fragment, измените onCreateView().

Верните view, который вы хотите показать во фрагменте, или преобразуйте свой Layout для просмотра с помощью LayoutInflater и верните его. 

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

Надеюсь, это работает. :)

6
Suryavel TR

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

5
mask

Я получал эту ошибку по разным причинам.

Действия по воспроизведению:

~> Моя проблема заключалась в том, что я создал совершенно новое пустое приложение. 

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

~> Продолжить настраивать фрагмент, добавляя макеты, кнопки и т.д.

~> Ссылка на новый пользовательский фрагмент в автоматически сгенерированном файле activity_my.xml, который был сгенерирован для меня при создании приложения. Это позволило XML сгенерировать объекты для меня. 

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

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

5
xMythicx

Для меня это было после прокрутки в трассировке стека, я обнаружил, что им не хватает разрешения для Android.permission.ACCESS_NETWORK_STATE

после добавления этого разрешения это было исправлено

5
Gil

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

Когда вы получаете ошибку, это только когда вы щелкаете по элементу в альбомном режиме или только в портретном режиме или в обоих? Использует ли ваша деятельность TaskDetailsFragment файл макета, в котором могут быть расхождения между альбомным и портретным режимами?

4
Nathan Fig

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

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

3
oddmeter

Ни одно из упомянутых выше решений не помогло мне. В журнале я мог найти детали исключения, как указано ниже:

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
Khushboo

Имел тот же тип ошибки, где отображалось точно такое же сообщение об ошибке в 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, упомянутые ранее.

2
Christian Bøge-Rasmussen

Если вы добавляете Fragment статически, то есть в xml, то, возможно, вы пропустили реализацию OnFragmentInteractionListener в своем классе Activity. Тогда реализация интерфейса решит проблему. Если вы добавляете Fragment динамически, то есть в класс Java, это не является решением. Потому что IDE сам по себе не позволит вам продолжить работу без реализации необходимых интерфейсов.

2
Shaheer Palollathil

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

1
southerton

убедитесь, что вы использовали этот 

<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
DjP

У меня была похожая проблема; запустив пример 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
user2270629

Если вы не хотите ничего менять и идти с тегом " фрагмент "

сделай это,

<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)
 />
1
Sahaj Rana

Если вы хотите унаследовать AppCompatActivity , то вы можете сделать что-то вроде этого -- В XML-файле активности используйте FrameLayout like this-

<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();
1
Vaibhav Sharma

В вашем XML-файле просто используйте вместо тега . Инфлятор пытается создать Android.app.Fragment, из которого произойдет сбой API <10 . Поэтому вам нужно создать группу представления другого типа ,.

1
Lucas de Vil

После одного дня борьбы я обнаружил, что проверка сценария может быть, вы сталкиваетесь с тем же,

Если все работает так же, как код 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
Yogesh Rathi

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

1
AdamVe

Я получил эту ошибку при использовании ListFragment, но id представления списка был listView1 вместо list.

'Ваш контент должен иметь ListView, атрибут id которого равен' Android.R.id.list ''

http://developer.Android.com/reference/Android/app/ListFragment.html

1
Eric Woodruff

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

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

ваш код делает то же самое?

1
Ahmad Moussa

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

1
stevethecollier

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

...
Android.view.InflateException: 
Binary XML file line #24: Error inflating class fragment
...
Caused by: Java.lang.InstantiationException: 
class *.HomeFragment has no zero argument constructor
...

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

public HomeFragment() {}
0
TonnyTao

Вот мое решение этой проблемы.

Caused by: Android.view.InflateException: Binary XML file line #31: Error inflating class fragment
Caused by: Java.lang.IllegalArgumentException: Binary XML file line #31: Duplicate id 0x7f09006d, tag null, or parent id 0xffffffff with another fragment for com.example.eduardf.audit.DateTime

В моем случае произошла ошибка при повторном открытии DialogFragment с фрагментом. 

<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:drawableStart="@drawable/ic_black_edit_24px"
            Android:singleLine="true" />
        <fragment
            Android:id="@+id/fragment_date"
            Android:name="com.example.eduardf.audit.DateTime"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            tools:layout="@layout/fragment_date_time" />
    </LinearLayout>
</Android.support.constraint.ConstraintLayout>

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

@Override
public void onDestroyView () {
    if (!(afterRotate || getActivity() == null)) {
        final FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_date);
        if (fragment != null)
            fragmentManager.beginTransaction().remove(fragment).commit();
    }
    super.onDestroyView();
}

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

private boolean afterRotate = false;
...
@Override
public void onSaveInstanceState (Bundle outState) {
    super.onSaveInstanceState(outState);
    afterRotate = true;
}
0
Eduard Fomin

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

0
Nuwan Karunarathna

Мой простой подход

Если вы используете <fragment> в своем xml, вы должны предоставить атрибут name i.e; 

      <fragment 
        Android:name='path.to.your.fragment
        />`

который инициализирует ваш фрагмент, и вам не нужно делать это из Java.

Если вы хотите использовать подход Java для добавления фрагмента, используйте любой макет, например

<LinearLayout
   Android:id="@+id/fragment_container"
 />

и использовать этот контейнер для вашего фрагмента

transaction.replace(R.id.fragment_container, fragment_obj);
0
Santosh Kumar

Убедитесь, что ваша активность расширяет FragmentActivity или AppCompatActivity

0
Riyas PK

Убедитесь, что вы поместили свой google-services.json в соответствующую папку и явно добавили 

<meta-dataandroid:name="com.google.Android.geo.API_KEY" Android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />

в вашем файле манифеста. Проверьте ваш gradle с "реализация" com.google.Android.gms: play-services-maps: 15.0.1 '"

Это будет работать.

0
Sankha Pattanayak