私が経験している問題は、特定のアクティビティのlayout
XMLに対して選択されているリソースバケットが、各セットでまったく同じリソース修飾子が使用されているにもかかわらず、values
フォルダーから選択されているリソースと一致しないことを示していますフォルダの。
アプリケーションの抽象親アクティビティ内にロギングコードを配置した後、Nexus 7タイプのエミュレーター(Android 4.1)でアプリケーションを起動すると、最小幅は確かに600dpであり、layout-sw600dp-*
フォルダーを使用してUIをフェッチしています。アクティビティの場合、values
に使用されているフォルダーはvalues-large-*
です。これがvalues-sw600dp-*
であると期待していたため、アクティビティが実行されているリソースバケットに関する重要な情報が得られました。
すべてのAndroid.app.Activity
sについて、アプリの親アクティビティ内でログを記録するコード
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Configuration config = getResources().getConfiguration();
Log.i(this.getClass().getSimpleName(), String.format("Smallest width is [%s]", config.smallestScreenWidthDp));
configurationContext = SupportedDeviceConfiguration.fromResourceQualifer(getString(string.resourceQualifier));
Log.i(this.getClass().getSimpleName(), String.format("Running under the [%s] configuration context.", configurationContext.getResourceQualifier()));
...
このコードをNexus 7タイプのデバイスで実行したときのログ出力。
[Logging fluff] Smallest width is [600]
[Logging fluff] Running under the [layout-large-land] configuration context.
私はあなたが何を考えているのか知っています-それはlayout-large-landの派生元はどこから来たのですか?読む...
概説されているアプローチを試してみています here これにより、実行時に使用中のリソースバケットを検査できます。基本的に、私が実装したアプローチには、次のリソース修飾子の構造があります。
- res
+ layout // Default portrait layout.
+ layout-land // Default landscape layout
+ layout-large-land // pre 3.2 phablet landscape layout (Galaxy Note at v2.3.3)
+ layout-xlarge-land // pre 3.2 tablet landscape layout
+ layout-xlarge-port // pre 3.2 tablet portrait layout
+ layout-sw520dp-port // post 3.1 phablet portrait layout (Galaxy Note at v4.0.3)
+ layout-sw520dp-land // post 3.1 phablet landscape layout
+ layout-sw600dp-port // post 3.1 mini-tablet portrait layout (Nexus 7)
+ layout-sw600dp-land // post 3.1 mini-tablet-landscape layout
+ layout-sw700dp-port // post 3.1 tablet portrait layout
+ layout-sw700dp-land // post 3.1 tablet landscape layout
- values // Contains the root strings.xml
strings.xml
- values-land
default-config.xml
- values-large-land
default-config.xml
- values-xlarge-land
default-config.xml
- values-xlarge-port
default-config.xml
- values-sw520dp-port
default-config.xml
- values-sw520dp-land
default-config.xml
- values-sw600dp-port
default-config.xml
- values-sw600dp-land
default-config.xml
- values-sw700dp-port
default-config.xml
- values-sw700dp-land
default-config.xml
したがって、基本的にvalues
修飾子はlayout
修飾子のそれを反映しています。各values-*
フォルダーの下に、device-config.xml
という名前の単一のXMLファイルを定義しました。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="resourceQualifier">layout-{qualifier of values folder}</string>
</resources>
したがって、たとえば、values-sw600dp-land
フォルダのdevice-config.xml
には、layout-sw600dp-land
という値の単一の文字列が含まれています。ここでの目的は、コードが画面に表示されているリソースレイアウトと同期を保つことです。これは、関係する不動産が原因で、表示されたレイアウトに存在しないアイテムを「IDで検索」するときにコードが実行されないようにするために必要です。
実行時に使用されているバケットを知りたいというより深い推論は、すべての構成に対応する単一フラグメントのコードが、透過的ではなくさまざまなスイッチベースのロジックで管理するのが難しくなり、他のレイアウト...私はある種の Fragment Inheritance が必要であるかのようでした...これは、リンクをたどる場合はまさに私がしたことです。これの欠点は、x、y、またはzフラグメントをインスタンス化するようにフレームワークに指示する前に、どの画面で作業しているのかを知る必要があることです。作成されるフラグメントがレイアウトと同期しないことはありません。膨張することを意図しています。この継承は機能し、はるかに扱いやすいフラグメントスタックを可能にします(ソナーも嬉しいです。これは素晴らしいことです)。
ただし、フレームワークが選択するレイアウトフォルダーと値フォルダーの間のこの明らかな不一致によって私は妨げられました。それぞれに同じ修飾子があるため、layout-sw600dp-land
UI XMLを利用するアクティビティがvalues-sw600dp-land
リソースを使用しないのはなぜですか? SO私が上記にリンクしたディスカッションに投稿された潜在的なソリューションの最も近いものだったので、何か問題があったことを願っています。
選択に使用されるリソースの優先順位を扱っていると思います。
フォルダを提供する場合:
layout-sw600dp-*
values-large-*
values-sw600dp-*
Androidは、values選択フォルダーをlayoutのものに一致させる義務はありません。むしろ、レイアウトと値フォルダーに別々に同じ優先ロジックを使用します。
この選択アルゴリズムについては、ここで学ぶことができます: http://developer.Android.com/guide/topics/resources/providing-resources.html#BestMatch
Android 4.0.3のアプリを実行しています。sw600dp、sw720dpを使用する場合、次を使用する必要がありますか?
-values-sw600dp-land default-config.xml
-values-sw700dp-port default-config.xml
-values-sw700dp-land default-config.xml res/values-XXXを使用していないため、正常に動作しているようです。