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

我得到错误

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

【问题讨论】:

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

标签: android android-layout android-fragments


【解决方案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_width="0dp"
             android:layout_weight="2"
             android:layout_height="match_parent"
             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_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;
                  }
                  

                  【讨论】:

                    【解决方案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_height="fill_parent"
                                  android:layout_width="fill_parent"
                                  class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
                        

                        【讨论】:

                          【解决方案13】:

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

                          【讨论】:

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

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

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

                          【讨论】:

                          • 绝对和这里的主要问题无关。
                          猜你喜欢
                          • 2013-05-28
                          • 1970-01-01
                          • 2014-05-19
                          • 2023-03-05
                          • 2015-04-15
                          相关资源
                          最近更新 更多