膨胀类片段时出错

Posted

技术标签:

【中文标题】膨胀类片段时出错【英文标题】:Error inflating class fragment 【发布时间】:2011-09-19 11:19:18 【问题描述】:

我得到错误

Unable to start activity ComponentInfode.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_
               android:layout_ >

    <ListView android:id="@+id/android:list"
              android:layout_
              android:layout_/> 

    <fragment android:id="@+id/fragmentDetails"
              android:layout_
              android:layout_
              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         
ComponentInfode.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

【问题讨论】:

您是否在 layout 和 layout-land 文件夹中保留了单独的布局文件? 您能否提供完整的错误日志,包括之后“无法启动活动...”的行 @Nathan Fig: 是的,我知道.. 但是出现错误.. @Dave:给你..有什么想法吗? 需要横向布局代码,并且您对 setContentView 的调用以及您如何在纵向模式下触发活动也很有帮助,就像我假设的那样。目前似乎没有足够的信息。查看 API 演示中的 FragmentLayout 示例可能会对您有所帮助,因为听起来您正在做类似的事情。 【参考方案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 示例开始,将您现有的应用添加到其中:我会节省很多时间!!!

【讨论】:

【参考方案2】:

如果你对 Navigation 组件使用混淆,你需要排除 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

【讨论】:

【参考方案3】:

我在片段中添加了一个 id,一切正常。在此之前,我如上所述更改了清单文件,但没有解决我的错误。当您看到错误尝试完全阅读它时,您将了解为什么会出现错误。就我而言,在错误跟踪的中间,显示片段 id 丢失。

<fragment
       android:layout_
       android:layout_weight="2"
       android:layout_
       class="com.example.mydemofragmentapp.FoodListFragment"
       android:id="@+id/none"/>

【讨论】:

【参考方案4】:

我没有 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"

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

就我而言,

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

【讨论】:

【参考方案7】:

我的简单方法

如果您在 xml 中使用 &lt;fragment&gt;,那么您必须提供 name 属性,即;

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

这将初始化您的片段,您不需要从 java 中进行。

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

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

并将此容器用于您的片段

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

【讨论】:

【参考方案8】:

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

它会起作用的。

【讨论】:

【参考方案9】:

这是我对这个问题的解决方案。

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

在我的情况下,使用 Fragment 重新打开 DialogFragment 时发生错误。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_>
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">
        <TextView
            android:id="@+id/title"
            android:layout_
            android:layout_
            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_
            android:layout_
            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;

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我的问题是我在 value 文件夹中添加了 Google maps API 密钥!将其移至src/debug/res/values/sensitive_keys.xml

【讨论】:

【参考方案12】:

使用 androidx.fragment.app.FragmentContainerView 代替片段。这是一个例子:

 <androidx.fragment.app.FragmentContainerView 
          android:id="@+id/fragmentDetails"
          android:layout_
          android:layout_
          class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 

【讨论】:

【参考方案13】:

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

【讨论】:

您是否想尝试将其改写成更能给人一种有用的答案的印象,而不是“我也是”。邮政?我认为这是可能的。【参考方案14】:

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

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

【讨论】:

绝对和这里的主要问题无关。

以上是关于膨胀类片段时出错的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:膨胀类片段时出错

在活动映射 xml 中膨胀类片段时出错

在我的“设置”片段中膨胀类 PreferenceScreen 时出错

二进制 XML 文件第 13 行:膨胀类片段时出错

第 7 行的 InflateException 二进制 XML 文件:膨胀类片段时出错

android.view.InflateException:二进制 XML 文件:膨胀类片段时出错