膨胀类片段时出错

我得到了错误

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
348414 次浏览

你有没有试过:

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

如果您有单独的纵向和横向模式的布局文件,并且在单击某个项目后更改方向时得到一个通货膨胀错误,则布局文件之间很可能存在差异。

当您得到错误,是否只有当您点击项目在横向模式或只有在纵向模式或两者?您的 TaskDetailsFragment 活动是否使用可能在横向模式和纵向模式之间存在差异的布局文件?

我也遇到了同样的问题,我的解决方案是在片段活动中使用 super.onCreate 和 setContentView 的顺序

以下命令可以正常工作:

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

如果你的 TaskDetailsFragment延伸到 android.app.Fragment,改变 onCreateView()

返回你想在片段中显示的 风景,或者通过使用 布局将布局转换为视图并返回它。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainview = inflater.inflate(R.layout.main, null);
return mainview;
}

希望这能管用

我和你面临着同样的问题。 上面的提示对我没有任何帮助。 后来,我发现我所要做的就是修复我的导入:

import android.app.Fragment;

致:

import android.support.v4.app.Fragment;

正如赫德米尔钦所说,一定要使用:

import android.support.v4.app.Fragment;

并且还要确保使用片段的 Activity 扩展了 FragmentActivity而不是常规的 Activity,

import android.support.v4.app.FragmentActivity;

去上 FragmentActivity课。

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

确保你的 Activity延伸到 FragmentActivity

确保片段的 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)

如果在调用 onActivityCreated()之前在片段中使用 getActivity()进行操作,则可能会发生 android.view.InflateException: Binary XML file line: #... Error inflating class fragment异常。在这种情况下,您会收到一个错误的活动引用,并且不能依赖它。

例如,下一个模式是错误的:

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

在 xml 文件中,只需使用。 充气器试图创建一个 android.app.Fragment,在 API < 10时该片段将失败。 因此,您需要创建一个不同类型的视图组。

具有相同的错误类型,其中显示了 logcat 中完全相同的错误消息。我需要对位于 Project->Properties下的 JavaBuild 路径进行更改。我已经包括了谷歌地图相关的库,如 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 文件。

上面提到的解决方案都没有帮助到我。在日志中我可以找到下面提到的异常的细节:

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>

我在使用 ListFragment 时得到了这个错误,但是列表视图 id 是 listView1而不是 list。

你的内容必须有一个 ListView,它的 id 属性是‘ android.R.id.list’

Http://developer.android.com/reference/android/app/listfragment.html

确保你用过这个

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

我也犯了同样的错误。我挖了一整天,不知道,但我想我尝试了约25个解决这个问题的办法。直到凌晨2点我发现我在 apps Manifxml 中漏掉了这一行:

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

这句话是在 <application>标签里面的。我真的希望这句话能对某些人有所帮助。 GL.

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

一旦我解决了空指针异常,我的片段就可以正常加载了。

只是犯了同样的错误。我的原因是我的片段类的可见性。它被设置为默认,应该是公共的。

你能公布片段的 onCreateonCreateView方法吗?我有一个完全相同的异常,它是由片段 onCreate方法中的一个异常引起的,当我修复那个问题时,它修复了 膨胀类片段时出错。

对我来说,是在堆栈跟踪中滚动之后,我发现 IM 丢失了 android.permission. ACCESS _ NETWORK _ STATE 的权限

在添加了这个权限之后,它被修复了

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

复制步骤:

我的问题是,我创建了一个全新的空白应用程序。

然后我从文件 ~ > 新建文件菜单中生成了一个自定义片段。

通过添加布局和按钮等来自定义片段。

在自动生成的 activity _ my.xml 中引用了新的自定义片段,该片段是在创建应用程序时为我生成的。这样做允许 XML 为我生成对象。

当通过 File ~ > New File Menu 生成自定义片段时,它会自动生成一个接口函数存根,并将其放置在片段类文件的底部。

这意味着 MyActivity 类必须实现这个接口。如果没有,那么只有在从 xml 引用片段时才会发生上述错误。通过完全删除 XML 中的片段引用,并通过在 myActivity.java 类文件中的代码创建片段,Logcat 会产生一个更简洁的错误,详细解释了这个问题,并抱怨了接口。这在项目模板活动 + 片段中得到了演示。尽管 < ~ that Project Template 不生成接口存根。

我也遇到过类似的问题; 在运行 AdMob 的例子之后,我试图在我的应用程序中插入广告,结果导致了这个错误:

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 示例开始,并将您现有的应用程序添加到其中: 我会节省很多时间! ! !

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

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

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

添加这个清单解决了我的问题

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

片段不能嵌套在 XML 中

通过艰苦的方式学到了这一点——如果您将一个基于 XML 布局的 <fragment>标记嵌套在(可能)从 FragmentManager动态加载的片段中,那么您就会开始出现奇怪的错误,试图膨胀您的片段 XML。

原来,这是 没有支持-它将工作良好,如果你这样做,通过纯粹的 FragmentManager方法。

我之所以遇到这个问题,是因为我试图从 xml 加载 <DrawerLayout>内部的一个片段,当我弹出返回堆栈时,这会导致 onCreateView()方法崩溃。

如果你想继承 AppCompatActivity,那么你可以这样做- 在活动 xml 中,使用这样的 框架布局-

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

确保您的活动扩展了 FragmentActivity 或 AppCompatActivity

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

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

如果在 xml 中静态地添加 Fragment,那么可能没有在 Activity类中实现 OnFragmentInteractionListener。然后接口实现将解决这个问题。如果动态添加 Fragment,也就是说,在 java 类中,那么这不是解决方案。因为 IDE 本身不允许您在没有实现所需接口的情况下继续。

对我来说,

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

经过一天的斗争,我发现一些情况检查可能是你正面临着同样的,

如果一切都是工作相同的谷歌代码,然后请检查清单文件在我的情况下,我添加了地理键和地图键,这就是为什么异常发生,

注意-不要在清单文件中添加两个键删除映射键

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

我的简单方法

如果在 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);

如果你不想改变任何东西,去“ 碎片”标签

这样做,

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

确保你已经把你的 google-services. json 放在你各自的文件夹中

<meta-dataandroid:name="com.google.android.geo.API_KEY" android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />

在您的清单文件。检查您的等级与 “实现‘ com.google.android.gms: play-services-map: 15.0.1’”

会成功的。

这是我对这个问题的解决办法。

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

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

如果在导航组件中使用模糊处理,则需要排除 android 的片段和 args。 将这些行添加到您的前卫规则文件中:

# 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

我在我的片段中加了一个 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"/>

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

你可以从 Jetpack/AndroidX 医生上获得最新版本:

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

对我来说,重构的代码导致了这个问题。我将一个片段移动到一个新包中,xml 文件中的一个引用导致了 bug。因此,要非常好地检查代码

我想加上一个可能的答案,开始吧。

我的情况是,我将我的项目从 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

我的问题是,我正在添加谷歌地图 API 的价值文件夹的关键! 移动到 src/debug/res/values/sensitive_keys.xml

使用 androidx.ragment.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"/>

<activity android:name=".SignUp" android:configChanges="keyboardHidden|orientation|screenSize">

将这一行添加到所有活动中,以避免因方向改变而崩溃。这将避免在方向更改时一次又一次地加载活动。

提供者: 在这里输入链接描述

在我的例子中,问题是在目标活动移动之后开始发生的。 原因在于 Android 数据绑定——以前它生成中间类,活动类之后移动这些中间文件。 清理项目有所帮助。