膨胀类片段时出错
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 中使用 <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);
【讨论】:
【参考方案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"/>
【讨论】:
绝对和这里的主要问题无关。以上是关于膨胀类片段时出错的主要内容,如果未能解决你的问题,请参考以下文章
在我的“设置”片段中膨胀类 PreferenceScreen 时出错