Ошибка надувания фрагмента класса
Я получаю ошибку
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
47 ответов
Как сказал hdemirchian, обязательно используйте:
import android.support.v4.app.Fragment;
А также убедитесь, что действие, использующее фрагмент (ы), расширяется FragmentActivity
вместо обычного Activity
,
import android.support.v4.app.FragmentActivity;
чтобы получить FragmentActivity
учебный класс.
Исключение 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(...);
}
У меня была такая же ошибка. Я копал весь день, не знаю, но я думаю, что попробовал ~25 решений по этой проблеме. Ничего не работало, пока в 2 часа ночи я не узнал, что мне не хватает этой строки в xml-файле приложения:
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Эта линия была внутри <application>
тег. Я очень надеюсь, что это поможет кому-то.
GL.
У меня такая же проблема. Решением для меня был порядок super.onCreate и setContentView в FragmentActivity
Следующий заказ работает нормально:
super.onCreate(savedInstanceState);
setContentView(R.layout.fc_activity_list_profiles);
Фрагменты не могут быть вложены в XML
Научился этому нелегко - если вы вложите XML-макет на основе <fragment>
тег внутри (потенциально) динамически загруженного фрагмента из FragmentManager
Затем вы начинаете получать странные ошибки, пытаясь надуть ваш фрагмент xml.
Оказывается, это не поддерживается - он будет работать нормально, если вы делаете это только через FragmentManager
подход.
Я получил эту проблему, потому что я пытался загрузить фрагмент внутри <DrawerLayout>
из XML, и это вызывало сбой в onCreateView()
метод, когда я выскочил обратно стек
У меня была та же проблема, с которой вы столкнулись. Ни один из советов сверху не помог мне. Позже я обнаружил, что все, что мне нужно было сделать, это исправить импорт из:
import android.app.Fragment;
чтобы:
import android.support.v4.app.Fragment;
Ты пытался:
<fragment
android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Убедитесь, что в методе 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)
Я получал эту ошибку по разным причинам.
Действия по воспроизведению:
~> Моя проблема заключалась в том, что я создал совершенно новое пустое приложение.
~> Затем я сгенерировал пользовательский фрагмент из меню Файл ~> Новый файл.
~> Продолжить настраивать фрагмент, добавляя макеты, кнопки и т. Д.
~> Ссылка на новый пользовательский фрагмент в автоматически сгенерированном файле activity_my.xml, который был сгенерирован для меня при создании приложения. Это позволило XML сгенерировать объекты для меня.
Вот ловушка при генерации пользовательского фрагмента через File ~> New File Menu, он автоматически генерирует заглушку интерфейсной функции и помещает ее в конец файла класса фрагмента.
Это означает, что ваш класс MyActivity должен реализовывать этот интерфейс. Если это не так, то вышеупомянутая ошибка возникает только при ссылке на фрагмент из XML. При полном удалении ссылки на фрагмент в XML и создании фрагмента с помощью кода в файле класса MyActivity.java Logcat генерирует более краткую ошибку, подробно объясняющую проблему и жалующуюся на интерфейс. Это продемонстрировано в шаблоне проекта "Деятельность + фрагмент". Хотя <~ этот шаблон проекта не генерирует заглушку интерфейса.
Проверьте ваш путь к классу, возможно, инфлятор представления не может найти определение вашего класса, как определено в вашем xml class="de.androidbuch.activiti.task.TaskDetailsFragment", указанный выше путь может быть неправильным.
Если твой 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;
}
Надеюсь, это работает.:)
Для меня это было после прокрутки в трассировке стека, я обнаружил, что им не хватает разрешения для android.permission.ACCESS_NETWORK_STATE
после добавления этого разрешения это было исправлено
Если вы не хотите ничего менять и идите с тегомфрагмента
сделай это,
<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)
/>
Если вы добавляете Fragment
статически, то есть в XML, то вы, возможно, пропустили реализовать OnFragmentInteractionListener
в вашем Activity
учебный класс. Тогда реализация интерфейса решит проблему. Если вы добавляете Fragment
динамически, то есть в классе Java, то это не решение. Потому что сама IDE не позволит вам продолжить работу без реализации необходимых интерфейсов.
Используйте androidx.fragment.app.FragmentContainerView вместо фрагмента. Вот пример:
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentDetails"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
class="de.androidbuch.activiti.task.TaskDetailsFragment"/>
Если у вас есть отдельные файлы макетов для портретного и альбомного режимов, и вы получаете ошибку инфляции при каждом изменении ориентации после нажатия на элемент, скорее всего, существует несоответствие между файлами макета.
Когда вы получаете ошибку, это только когда вы щелкаете по элементу в альбомном режиме или только в портретном режиме или в обоих? Использует ли ваша деятельность TaskDetailsFragment файл макета, в котором могут быть расхождения между альбомным и портретным режимами?
В этом случае моей проблемой был простой случай, когда в одном из моих методов вызывалось исключение из-за тупого нулевого указателя, которое вызывалось позже в жизненном цикле. Это вызывало у меня исключение "Ошибка раздувания фрагмента класса". Короче говоря, не забудьте проверить дальнейшую трассировку стека исключений для возможной причины.
Как только я разрешил исключение нулевого указателя, мой фрагмент загрузился нормально.
Ни одно из упомянутых выше решений не помогло мне. В журнале я мог найти детали исключения, как указано ниже:
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>
Имел тот же тип ошибки, где отображалось точно такое же сообщение об ошибке в 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, упомянутые ранее.
Если вы хотите унаследовать действие 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();
Я получил эту ошибку при использовании ListFragment, но id представления списка был listView1 вместо list.
'Ваш контент должен иметь ListView, атрибут id которого' android.R.id.list ''
http://developer.android.com/reference/android/app/ListFragment.html
Хочу добавить возможный ответ. Итак, поехали.
Моя ситуация такова, что я меняю свой проект с Java на Kotlin, а затем добавляю компонент навигации. После перехода на Kotlin я добавляю. Но после попытки запустить приложение у меня возникла ошибка наддува . Проверив дальше и сравнив с другими проектами, выключаем My
nav_graph.xml
не было
app:startDestination="@id/mainFragment"
. После добавления ошибка исчезла, и мой проект работает нормально, без ошибок.
nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="fragment.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main" />
</navigation>
Итак, не забывайте
app:startDestination
.
Я добавил идентификатор к своему фрагменту, все работает нормально. Перед этим я изменил файл манифестов, как упоминалось выше, но мою ошибку не решил. Когда вы видите ошибку, попробуйте прочитать ее полностью, вы узнаете, почему возникла ошибка. В моем случае в середине трассировки ошибки было показано, что идентификатор фрагмента отсутствует.
<fragment
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
class="com.example.mydemofragmentapp.FoodListFragment"
android:id="@+id/none"/>
Я получил ту же ошибку, но моя проблема заключалась в том, что у моего фрагмента не было идентификатора в макете xml родительского действия.
У меня была похожая проблема; после запуска примера 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 и добавьте в него свое существующее приложение: я бы сэкономил много времени!!!
У меня не было
androidx.fragment:fragment
зависимость.
Вы можете получить последнюю версию от Jetpack / AndroidX документов :
dependencies {
def fragment_version = "1.2.5"
// Java language implementation
implementation "androidx.fragment:fragment:$fragment_version"
// Kotlin
implementation "androidx.fragment:fragment-ktx:$fragment_version"
// Testing Fragments in Isolation
debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
}
Не могли бы вы опубликовать фрагмент onCreate
а также onCreateView
методы? У меня было точно такое же исключение, которое было вызвано исключением во фрагменте onCreate
метод, когда я исправил эту проблему, он исправил ошибку, надувающую фрагмент класса.
После одного дня борьбы я обнаружил, что проверка сценария может быть, вы сталкиваетесь с тем же,
Если все работает так же, как код 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"/>
Убедитесь, что вы использовали этот
<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" />