膨胀类片段时出错

时间:2011-06-21 11:58:38

标签: android android-layout android-fragments

我收到了错误

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

42 个答案:

答案 0 :(得分:124)

正如hdemirchian所说,请务必使用:

import android.support.v4.app.Fragment;

并确保使用片段的活动扩展FragmentActivity而不是常规Activity

import android.support.v4.app.FragmentActivity;

获取FragmentActivity课程。

答案 1 :(得分:90)

如果在调用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(...);
}

答案 2 :(得分:52)

确保Activity延长FragmentActivity

答案 3 :(得分:32)

我有同样的错误。我整天都在挖,不知道但是我想我在这个问题上试过了25个解决方案。没有工作,直到凌晨2点我发现我在应用程序清单xml中错过了这一行:

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

该行位于<application>标记内。我真的希望这对某人有帮助。 GL。

答案 4 :(得分:22)

我遇到了同样的问题。我的解决方案是FragmentActivity中的super.onCreate和setContentView的顺序

以下订单工作正常:

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

答案 5 :(得分:17)

碎片不能嵌套在XML

通过艰难的方式了解这一点 - 如果您在<fragment>的(可能)动态加载的片段中嵌入基于FragmentManager标记的XML布局,那么您会开始出现奇怪的错误,尝试给您的片段充气XML。

事实证明,这是不支持 - 如果你通过纯粹的FragmentManager方法做到这一点,它将正常工作。

我遇到了这个问题,因为我正在尝试从xml加载一个<DrawerLayout>内的片段,当我弹出后面的堆栈时,这导致onCreateView()方法崩溃。

答案 6 :(得分:16)

我遇到的问题与你面临的问题相同。 顶部的提示都没有帮助我。 后来,我发现我所要做的就是修复我的导入:

import android.app.Fragment;

为:

import android.support.v4.app.Fragment;

答案 7 :(得分: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)

答案 8 :(得分:10)

你试过了吗?

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

答案 9 :(得分: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;
}

希望这有效。 :)

答案 10 :(得分:5)

检查类路径,这可能是视图充气器无法找到xml中定义的类定义 类= “de.androidbuch.activiti.task.TaskDetailsFragment” 上述路径可能是错误的。

答案 11 :(得分:5)

我出于不同的原因收到了这个错误。

重现的步骤:

〜&GT;我的问题是我创建了一个全新的空白应用程序。

〜&GT;然后我从File~&gt;生成了一个自定义片段。新文件菜单。

〜&GT;继续通过添加布局和按钮等来自定义片段。

〜&GT;在创建应用程序时为我生成的自动生成的activity_my.xml中引用了新的自定义片段。这样做允许XML为我生成对象。

通过File~&gt;生成自定义片段时,Heres是一个问题。新的文件菜单它会自动生成一个接口函数存根,并将其放在片段类文件的底部。

这意味着您的MyActivity类必须实现此接口。如果没有,则仅在引用xml中的片段时才会发生上述错误。通过完全删除XML中Fragment的引用,并通过MyActivity.java类文件中的代码创建片段,Logcat会生成更简洁的错误,详细解释问题并抱怨接口。这在项目模板活动+片段中进行了演示。虽然,&lt;〜项目模板不生成接口存根。

答案 12 :(得分:5)

对我而言,在滚动堆栈跟踪后我发现我错过了android.permission.ACCESS_NETWORK_STATE的权限

添加此权限后,它已修复

答案 13 :(得分:4)

如果您有纵向和横向模式的单独布局文件,并且在单击项目后更改方向时出现充气错误,则布局文件之间很可能存在差异。

当您收到错误时,是仅在横向模式下单击项目还是仅在纵向模式下或两者都单击时?您的TaskDetailsFragment活动是否使用可能在横向和纵向模式之间存在差异的布局文件?

答案 14 :(得分:3)

在这种情况下我的问题是在我的一个方法中有一个哑空指针异常的简单实例,这个方法稍后在生命周期中被调用。这导致&#34;错误膨胀类片段&#34;我的例外。简而言之,请记住检查异常堆栈跟踪中的可能原因。

一旦我解决了空指针异常,我的片段加载得很好。

答案 15 :(得分: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>

答案 16 :(得分:2)

如果您要在xml中静态添加Fragment,那么您可能错过了在OnFragmentInteractionListener课程中实施Activity。然后接口实现将解决问题。如果要动态添加Fragment,即在java类中,那么这不是解决方案。因为IDE本身不允许您在不实现所需接口的情况下继续。

答案 17 :(得分:2)

有相同的错误类型,其中显示了logcat中完全相同的错误消息。我需要在Project->Properties下的Java Build Path中进行更改。我加入了Google地图相关库,例如android-support-v4.jargoogle-play-services.jar;但我在'Build class path'选项菜单中的'Order and Export'上遗漏了这些内容。也许错误就在这里。

尝试将库包含到构建类路径中。

构建类的顺序也可能触发错误,所以我的建议也是尝试重新排列构建路径的顺序。当我使用以下顺序时,错误消失了:'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'。最后一个单元包含前面提到的jar文件。

答案 18 :(得分:2)

如果您不想更改任何内容,请使用“ 片段”标签

执行此操作

<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)
 />

答案 19 :(得分:1)

经过一天的挣扎,我发现一些情景检查可能是你面临同样的,

  

如果所有内容与谷歌代码相同,请在我的情况下检查清单文件我添加了地理位置密钥和地图密钥,这就是发生异常的原因,

注意 - 请勿在清单文件中添加两个键删除地图密钥

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"/>

答案 20 :(得分:1)

我遇到了同样的错误,但我的问题是我的片段在父活动的xml布局中没有id。

答案 21 :(得分: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();

答案 22 :(得分:1)

我有类似的问题;运行AdMob example后,我尝试在我的应用中插入广告,导致此错误:

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

解决方案是:您无法将Ad的片段插入ListActivity。 相反,我可以毫无问题地将它添加到FragmentActivity和ActionBarActivity。

我的建议是:从AdMob示例开始,然后将现有应用添加到其中:我会节省很多时间!!!

答案 23 :(得分:1)

我在android studio中收到此错误的问题是我的片段有一个相对布局,而OnCreateView函数上的代码是

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

你的代码做同样的事情吗?

答案 24 :(得分:1)

您可以发布片段的onCreateonCreateView方法吗?我有完全相同的异常是由片段onCreate方法中的异常引起的,当我修复了这个问题时它解决了错误膨胀类片段。

答案 25 :(得分:1)

刚出现同样的错误。我的原因是我的片段类的可见性。它被设置为默认值,应该是公开的。

答案 26 :(得分: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" /> 

答案 27 :(得分:1)

使用ListFragment时出现此错误,但列表视图ID为listView1而不是list。

'您的内容必须有一个ListView,其id属性为'android.R.id.list''

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

答案 28 :(得分:1)

在xml文件中只使用a而不是标记。 inflater尝试创建一个android.app.Fragment,它将在API&lt; 10。 因此,您需要创建一个不同类型的视图组。

答案 29 :(得分:0)

我想添加一个可能的答案。那么我们开始吧。

我的情况是,我将我的项目从 Java 改为 Kotlin,然后添加导航组件。迁移到 Kotlin 后,我添加了 nav_graph.xml。但是,在尝试运行该应用程序后,我遇到了膨胀错误。在进一步检查并与其他项目比较后,结果我的 nav_graph.xml 没有 app:startDestination="@id/mainFragment"。添加 app:startDestination 后,错误消失了,我的项目运行良好,没有错误。

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

答案 30 :(得分:0)

对我来说,重构的代码导致了这个问题。我将一个片段移动到一个新包中,xml 文件中的一个引用导致了该错误。所以好好检查你的代码

答案 31 :(得分:0)

我没有androidx.fragment:fragment依赖项。

您可以从Jetpack / AndroidX docs获取最新版本:

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"
}

答案 32 :(得分:0)

我在片段中添加了一个id,这样一切正常。在此之前,我如上所述更改了清单文件,但没有解决我的错误。当您看到错误时,请尝试完整阅读它,您将了解为什么会有错误。以我为例,在错误跟踪的中间,发现片段ID丢失了。

<fragment
       android:layout_width="0dp"
       android:layout_weight="2"
       android:layout_height="match_parent"
       class="com.example.mydemofragmentapp.FoodListFragment"
       android:id="@+id/none"/>

答案 33 :(得分:0)

如果对导航组件使用混淆处理,则需要排除android的片段和args。 将这些行添加到您的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

答案 34 :(得分:0)

如果您的活动未在清单中注册,这可能是您遇到的错误之一。检查并确保您的活动已在清单上注册,这可能是导致错误的原因。

答案 35 :(得分:0)

这是我解决这个问题的方法。

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;
}

答案 36 :(得分:0)

确保已将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'”

它将起作用。

答案 37 :(得分:0)

我的简单方法

如果您在xml中使用<fragment>,则必须提供name属性,即;

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

它将初始化你的片段,你不需要从java。

如果您想使用Java方法添加片段,请使用任何布局,如

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

并将此容器用于您的片段

transaction.replace(R.id.fragment_container, fragment_obj);

答案 38 :(得分:0)

就我而言,

...
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() {}

答案 39 :(得分:0)

如果您的片段是List Fragment,那么使用该片段的活动必须实现onFragmentInteraction接口。

答案 40 :(得分:0)

确保您的Activity扩展FragmentActivity或AppCompatActivity

答案 41 :(得分:-9)

将此添加到清单解决了我的问题

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>