Ошибка надувания фрагмента класса - PullRequest
147 голосов
/ 21 июня 2011

Я получаю сообщение об ошибке

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

Ответы [ 36 ]

124 голосов
/ 07 февраля 2012

Как сказал Хдемирчян, обязательно используйте:

import android.support.v4.app.Fragment;

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

import android.support.v4.app.FragmentActivity;

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

90 голосов
/ 28 февраля 2013

Исключение 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(...);
}
53 голосов
/ 23 мая 2012

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

33 голосов
/ 25 января 2014

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

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

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

22 голосов
/ 02 августа 2011

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

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

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);
17 голосов
/ 24 февраля 2016

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

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

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

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

16 голосов
/ 31 января 2012

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

import android.app.Fragment;

в:

import android.support.v4.app.Fragment;
12 голосов
/ 10 октября 2012

Убедитесь, что в методе 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)
10 голосов
/ 21 июня 2011

Вы пробовали:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
6 голосов
/ 28 декабря 2011

Если ваше 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...