首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >android.view.InflateException:二进制XML文件:膨胀类片段时出错

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

Stack Overflow用户
提问于 2013-11-09 18:26:05
回答 30查看 480K关注 0票数 182

我有一个非常令人沮丧的错误,我无法解释。我创建了一个Android应用程序,它使用Android AppCompat以使其与旧版本兼容。下面是我的主要活动布局文件:

下面是我活动的主要代码:

代码语言:javascript
复制
public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

这里的主要问题是:上面的代码在几乎所有的设备(模拟设备或一些真实设备)上都能顺利运行。但是当我在三星S3上运行它的时候。它注意到这个错误:

代码语言:javascript
复制
java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.access$700(ActivityThread.java:134)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4856)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
            at android.app.Activity.setContentView(Activity.java:1901)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)

请告诉我如何修复错误,谢谢:)

EN

回答 30

Stack Overflow用户

回答已采纳

发布于 2013-11-13 19:16:23

经过长时间的调试,我已经修复了这个问题。(尽管我仍然无法解释原因)。我改变了属性android:nameclass..。(虽然在Android文档上,他们说这些属性是相同的,但它是有效的!)

因此,它应该从:

代码语言:javascript
复制
android:name="com.fragment.NavigationDrawerFragment"

代码语言:javascript
复制
class = "com.fragment.NavigationDrawerFragment"

因此,新的布局应该是:

希望这能有所帮助:)

票数 140
EN

Stack Overflow用户

发布于 2017-05-24 03:05:46

TL/DR:发生异常在创建片段的过程中从更高级别的布局XML引用。此异常导致较高级别的布局膨胀失败,但是未报告初始异常;只有较高级别的充气失败才会出现在堆栈跟踪中。要找到根本原因,您必须捕获并记录初始异常..。

错误的最初原因可能是各种各样的事情,这就是为什么这里有这么多不同的答案,关于是什么为每个人解决了这个问题。对某些人来说,这与id, class,或者name

属性。对于其他人来说,这是由于权限问题或构建设置造成的。对我来说,这些并没有解决问题;相反,有一个可提取的资源,它只存在于drawable-ldrtl-xhdpi,而不是在适用的地方,如

drawable..。

但这些只是细节。最重要的问题是,logcat中显示的错误消息并没有描述引发这一切的异常。当较高级别的布局XML引用片段时,该片段的onCreateView()被调用。当一个onCreateView()异常发生在片段的(例如,在膨胀片段的布局XML时),它会导致较高级别布局XML的膨胀失败。这种更高级别的膨胀失败在错误日志中被报告为异常。但最初的异常似乎没有在整个链条上传播得足够好,以至于没有被报道出来。

在这种情况下,问题是当初始异常没有出现在错误日志中时,如何公开它。

解决方案非常简单:将一个try/catch

块围绕片段的内容onCreateView(),并且在catch

子句中,记录异常:

代码语言:javascript
复制
public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

这可能并不明显其中片段类的onCreateView()在这种情况下,要对导致问题的布局中使用的每个片段类执行此操作。例如,在OP的例子中,发生异常的应用程序代码是

代码语言:javascript
复制
at android.app.Activity.setContentView(Activity.java:1901)

这就是

代码语言:javascript
复制
setContentView(R.layout.activity_main);

因此,您需要在onCreateView()布局中引用的任何片段activity_main..。

在我的例子中,根本原因异常被证明是

代码语言:javascript
复制
Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

直到我捕获到这个异常,它才会出现在错误日志中onCreateView() 并明确记录下来。一旦它被记录下来,这个问题就很容易诊断和修复(details_view.xml

仅存在于ldrtl-xhdpi文件夹)。关键是捕获作为问题根源的异常,并公开它。

以样板的形式来做这件事并没有什么坏处。

全部你的碎片onCreateView()方法。如果其中有一个未捕获的异常,它将不管怎样都会使活动崩溃。唯一的区别是,如果您捕获并将异常记录在onCreateView(),你就不会对它发生的原因一无所知。

附注:我刚刚意识到这个答案与@DaveHubbard的答案有关,但使用了一种不同的方法来寻找根本原因(日志记录与调试器)。

票数 54
EN

Stack Overflow用户

发布于 2016-02-16 23:18:50

我无法使用提供的答案来解决我的问题。最后,我改变了这一点:

要做到这一点:

代码语言:javascript
复制
private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

而且它是有效的。

如果您在fragment中使用它,请使用getChildFragmentManager

而不是getSupportFragmentManager..。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19874882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档