2

我想根据应用程序是在智能手机还是平板电脑上运行来提供不同的布局。因此,我分别放置了不同的布局定义layout-normallayout-large.

在平板电脑上进行测试期间,当关联的活动第二次启动时,我遇到了以下异常:

09-06 13:28:43.640: E/AndroidRuntime(26260): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f030005
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.content.res.Resources.getValue(Resources.java:1010)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2088)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.content.res.Resources.getLayout(Resources.java:849)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.view.LayoutInflater.inflate(LayoutInflater.java:389)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:245)
09-06 13:28:43.640: E/AndroidRuntime(26260):    at android.app.Activity.setContentView(Activity.java:1786)
09-06 13:28:43.640: E/AndroidRuntime(26260):    ... 11 more

当第一次启动 Activity 时,一切都很好,并且布局正确膨胀。该错误仅在 Activity 完成并从后堆栈上的前一个 Activity 重新启动后发生。

我可以在运行 Android 3.2 的三星 Galaxy Tab 以及适用于 Android 3.2 和 4.1 的模拟器中重现该问题。布局是通过 加载的Activity.setContentView(int resId),所以此时没有什么魔力。此外,在 stacktrace() 中记录的资源 ID对应于给定#0x7f030005的根布局的 id 。R.layoutActivity.setContentView(int resId)

如果我将布局从文件夹复制layout-largelayout文件夹并更改副本中的背景颜色,则不会引发异常,但layout会加载具有修改后背景颜色的非特定版本。

在清单中,我已经配置了支持的屏幕

<supports-screens
    android:smallScreens="false"
    android:normalScreens="true" 
    android:largeScreens="true"
    android:xlargeScreens="true"
    android:anyDensity="true" />

有人知道如何解决这个问题吗?

4

1 回答 1

0

错误的起源是在我使用的外部库中:

他们正在构造一个子类对象android.content.res.Resources以伪造内存中的资源。该Resources对象的构造需要一个AssetManager作为参数之一,该参数是使用Activity的getAssets()方法获得的。似乎这正在破坏资源。

似乎构造Resource对象的正确方法是传入一个全新的AssetManager实例(这也意味着使用私有 AssetManager 构造函数)。

于 2012-11-10T09:52:04.507 回答