我有一个非常令人沮丧的错误,我无法解释。我创建了一个Android应用程序,它使用Android AppCompat
以使其与旧版本兼容。下面是我的主要活动布局文件:
下面是我活动的主要代码:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
这里的主要问题是:上面的代码在几乎所有的设备(模拟设备或一些真实设备)上都能顺利运行。但是当我在三星S3上运行它的时候。它注意到这个错误:
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)
请告诉我如何修复错误,谢谢:)
发布于 2013-11-13 19:16:23
经过长时间的调试,我已经修复了这个问题。(尽管我仍然无法解释原因)。我改变了属性android:name
至class
..。(虽然在Android文档上,他们说这些属性是相同的,但它是有效的!)
因此,它应该从:
android:name="com.fragment.NavigationDrawerFragment"
至
class = "com.fragment.NavigationDrawerFragment"
因此,新的布局应该是:
希望这能有所帮助:)
发布于 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
子句中,记录异常:
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的例子中,发生异常的应用程序代码是
at android.app.Activity.setContentView(Activity.java:1901)
这就是
setContentView(R.layout.activity_main);
因此,您需要在onCreateView()
布局中引用的任何片段activity_main
..。
在我的例子中,根本原因异常被证明是
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的答案有关,但使用了一种不同的方法来寻找根本原因(日志记录与调试器)。
发布于 2016-02-16 23:18:50
我无法使用提供的答案来解决我的问题。最后,我改变了这一点:
要做到这一点:
private void showGallery() {
ImageGalleryFragment fragment = new ImageGalleryFragment()
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
而且它是有效的。
如果您在fragment中使用它,请使用getChildFragmentManager
而不是getSupportFragmentManager..。
https://stackoverflow.com/questions/19874882
复制相似问题