错误夸大类片段


161

我得到错误

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

您是否在布局和布局图文件夹中保留单独的布局文件?
内森·

您能否提供完整的错误日志,包括“无法启动活动...” 之后的行
Dave

@Nathan Fig:是的,我是..但是得到了错误..
tsync 2011年

@戴夫:你去..有什么想法吗?
tsync 2011年

需要景观布局代码,并且对您很有用,例如您对setContentView的调用以及您在纵向模式下启动活动的方式,就像我假设的那样。目前似乎没有足够的信息。看一下API演示中的FragmentLayout示例可能对您有所帮助,因为听起来您正在做类似的事情。
PJL

Answers:


131

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

import android.support.v4.app.Fragment;

还要确保使用片段的Activity可以扩展,FragmentActivity而不是常规的Activity

import android.support.v4.app.FragmentActivity;

FragmentActivity上课。


12
这引起了很大的争议,但是对我来说,恢复应用程序时它崩溃了,我已经在使用v4 Fragment和v4 FrsgmentActivity-更准确地说是AppCompatActivity。
2015年

4
这不是解决方案。导入android.support.v4.app.Fragment; 不会改变任何东西。实际上,它甚至是未使用和不需要的导入。
f470071 2015年

7
谢谢,另外一点是AppCompatActivity是FragmentActivity的后代。
Abedfar'3

但我使用的是匕首片段,而匕首片段始终会扩展片段而不是片段活动
user3475052,19,25,19

96

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

@MaximKorobov您可以getActivity()在内部onActivityCreated()或任何后续生命周期方法中调用,但要在之前调用onDestroyView()
Grigori A.

非常感谢,这对您有很大帮助!
Shotgun Ninja

谢谢:-)这为我节省了很多时间:)
user1007522

我想了解更多有关此的信息,我遇到了偶发的崩溃,我认为这可能是问题所在。尽管大多数情况下代码都能正常工作,所以很难知道
Daniel Wilson

模式2可能已经为我解决了。手指交叉。感谢那。
约瑟夫2015年


36

我有同样的错误。我整天都在挖东西,不知道,但我想我尝试过25个解决此问题的方法。直到凌晨2点,任何方法都没有起作用,我发现我在应用程序清单xml中缺少此行:

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

那条线在<application>标签里面。我真的希望这对某人有帮助。GL。


3
我的英雄。像你这样的人很棒!
capdragon 2014年

5
请解释发生了什么。这条线有什么好处?
Mansour Fahad 2014年

2
谢谢,救救我。在Android上使用Google Map的每个示例的工作方式都不同,我想知道是否有一个标准。
user2812866 2014年

22

我有同样的问题。对我来说,解决方案是FragmentActivity中的super.onCreate和setContentView的顺序

以下顺序可以正常工作:

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

3
为什么可以解决此问题?
Spencer

1
在JAVA方法中,super必须始终在方法开始时调用。
斯特凡Bruckert

11
@StéphaneBruckert并非总是super.method()必须首先调用这种情况。这取决于超类的方法。在这种情况下,FragmentActivity需要进行一些初始化才能setContentView正常工作。但是,在另一种方法(例如onKeyUp)中,您可能需要有条件地对该操作进行一些处理,但是要回退到super.onKeyUp这种情况下,您很可能希望super.onKeyUp在函数的最后调用。
CoatedMoose13年

可能还值得注意的是super()(超类的构造函数)必须是任何子类构造函数中调用的第一个函数,但是调用它不一定是强制性的(它完全取决于要扩展的类)。
CoatedMoose13年

17

片段不能嵌套在XML中

很难理解这一点-如果您<fragment>在(可能)动态加载的片段中嵌套基于XML布局的标记FragmentManager,则您会开始遇到奇怪的错误,尝试将片段xml膨胀。

事实证明,支持此功能-如果您仅通过此FragmentManager方法进行操作,它将很好地工作。

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


仍然不支持吗?截至appcompat-v7:23.3.0
thanassis

是的,我将片段嵌套在xml中。我会调查的。
KDeogharkar '16

但是,存在针对该问题的解决方案/黑客:stackoverflow.com/a/14695397/860488
Morten Holmgaard,2016年

2
有关确认的信息,请参见本节末尾的注释:developer.android.com/about/versions/…–
Philippe

不知道为什么解决方案是如此简单。对我来说,只是更换<fragment><frameLayout>合作。我还在弄清楚。- stackoverflow.com/a/19167009/5477548
YOADW¯¯

16

我遇到的问题与您面临的问题相同。最重要的提示都没有帮助我。后来,我发现我所要做的就是修复来自以下位置的导入:

import android.app.Fragment;

至:

import android.support.v4.app.Fragment;

谢谢,这个解决方案也对我有用。我在这个问题上苦苦挣扎了2天。终于,您的解决方案为我工作了。谢谢hdemirchian。–
Lakshmanan

你真棒!我的问题是相反的-默认情况下,Fragment向导会导入android.support.v4.app.Fragment。我的主要活动是android.app.Activity。
工业控制怪胎

12

你有没有尝试过:

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

1
您已向我们显示了1个xml文件,但在/ layout /中应有2个,在layout-land /中应有2个
Blundell

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)

仅添加Lei的意思是,请尝试在oncreateview内查找代码,找出真正的根本原因。谢雷!
Swaroop,

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

希望这行得通。:)


6

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


6

我由于不同的原因收到此错误。

重现步骤:

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

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

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

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

这是通过File〜> New File Menu生成自定义片段时的注意事项,它会自动生成接口函数存根并将其放在片段类文件的底部。

这意味着您的MyActivity类必须实现此接口。如果不是,则仅当从xml引用片段时,才发生上述错误。通过完全删除XML中对Fragment的引用,并通过MyActivity.java类文件中的代码创建该片段,Logcat产生了一个更简洁的错误,详细解释了该问题并抱怨了该接口。这在“项目模板活动+片段”中得到了证明。虽然,<〜该项目模板不会生成接口存根。


5

对我来说,这是在滚动堆栈跟踪之后,我发现我缺少android.permission.ACCESS_NETWORK_STATE的权限

添加此权限后已修复


1
不要自我:“滚动浏览整个。堆栈跟踪谢谢@Gil。
Batandwa

4

如果您有用于纵向和横向模式的单独的布局文件,并且在单击项目后每次更改方向都会遇到膨胀错误,那么布局文件之间很可能存在差异。

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


感谢您的回答..好吧,我在风景模式下只有一个片段,而在人像模式下却没有。因此,我只能在横向模式下单击以查看片段。在我再次切换到横向模式后,出现此错误...
tsync 2011年

那么,几乎可以肯定是问题所在-您拥有纵向模式下的视图,而横向模式下找不到该视图。将片段添加到格局是否可以解决问题?
内森·

1
您可以拥有两个文件中都不存在的视图-这就是拥有-land和-port布局的重点。但是,请检查ID-我的肖像文件中缺少ID,并且在切换时出现此错误。
maxpolun

4

如果要Fragment静态添加(即在xml中),则可能错过了OnFragmentInteractionListenerActivity类中实现的功能。然后,接口实现将解决该问题。如果要Fragment动态添加,即在java类中添加,那么这不是解决方案。因为IDE本身不允许您在未实现所需接口的情况下继续进行操作。


3

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

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


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>

3

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

做这个,

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

2

具有相同的错误类型,在logcat中显示了完全相同的错误消息。我需要在下的Java构建路径中进行更改Project->Properties。我已经包括了与Google Maps相关的库,例如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文件。


1

在您的xml文件中,只需使用而不是标记即可。充气器尝试创建一个android.app.Fragment,该API将在API <10时失败。因此,您需要创建其他类型的视图组。



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

1

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


1

你可以张贴片段的onCreateonCreateView方法呢?我有完全相同的异常,这是由fragment onCreate方法中的异常引起的,当我解决该问题时,它修复了错误膨胀类片段。


1

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

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

您的代码是否在做同样的事情?


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

谢谢你的帮助。不知道为什么我能够在我开发的其他应用程序中成功在布局中使用<fragment>,但是在这里无法正常工作!
SingularityFuture

只是注意这可以工作,但这通常适用于动态片段而不是静态片段
Tanner Summers '18


1

经过一天的奋斗,我发现某些情况检查可能是您面临同样的情况,

如果一切都与Google代码相同,请检查清单文件(如果是我添加了地理关键字和地图关键字),这就是发生异常的原因,

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

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

1

我有一个类似的问题。在运行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

解决方案是:您不能将广告的片段插入ListActivity。相反,我可以毫无问题地将其添加到FragmentActivity和ActionBarActivity中。

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


1

如果您对导航组件使用混淆处理,则需要排除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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.