2

アプリがスマートフォンで実行されるか、タブレットで実行されるかによって、異なるレイアウトを提供したいと考えています。したがって、私はそれぞれに異なるレイアウト定義を入れましたlayout-normallayout-large.

タブレットでのテスト中に、関連するアクティビティが2 回目に開始されると、次の例外が発生します。

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

アクティビティが初めて開始されると、すべてがうまくいき、レイアウトが正しく膨張します。このエラーは、アクティビティが終了し、バック スタックの前のアクティビティから再開された後にのみ発生します。

Android 3.2 を実行している Samsung Galaxy Tab と、Android 3.2 および 4.1 のエミュレーターで問題を再現できました。レイアウトは を介し​​てロードされるActivity.setContentView(int resId)ため、この時点では魔法はありません。さらに、stacktrace() に記録されるリソース ID は、に与えられ#0x7f030005たルート レイアウトの ID に対応します。R.layoutActivity.setContentView(int resId)

layout-largeからフォルダにレイアウトをコピーlayoutし、コピーの背景色を変更すると、例外はスローされませんが、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オブジェクトの構築には、Activity のメソッドを使用して取得されたパラメーターの 1 つとして が必要でしたAssetManagergetAssets()これにより、リソースが破損していたようです。

オブジェクトを構築する正しい方法Resourceは、真新しいAssetManagerインスタンスを渡すことです (これは、プライベート AssetManager コンストラクターを使用することも意味します)。

于 2012-11-10T09:52:04.507 に答える