私が経験している問題は、特定のアクティビティのlayout
XMLに選択されているリソースバケットが、values
フォルダーの各セットでまったく同じリソース修飾子が使用されているにもかかわらず、フォルダーから選択されているリソースと矛盾していることを示しています。
例
アプリケーションの抽象的な親アクティビティ内にログコードを配置した後、Nexus 7タイプのエミュレーター(Android 4.1)でアプリケーションを起動すると、最小幅は実際に600dpであり、layout-sw600dp-*
フォルダーはアクティビティのUIをフェッチするために使用されていますが、に使用されているフォルダvalues
はですvalues-large-*
。values-sw600dp-*
このようにして、アクティビティが実行されているリソースバケットに関する重要な情報が提供されることを期待していました。
android.app.Activity
すべてのアプリの親アクティビティ内でロギングを実行するコード
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()));
...
Nexus7タイプのデバイスでこのコードを実行したときのログ出力。
[Logging fluff] Smallest width is [600]
[Logging fluff] Running under the [layout-large-land] configuration context.
私はあなたが何を考えているか知っています-そのレイアウト-広大な土地の派生はどこから来たのですか?読む...
バックグラウンド
ここで概説したアプローチを試しています。これにより、実行時に使用中のリソースバケットを検査できます。基本的に、私が実装したアプローチには、次のようなリソース修飾子の構造があります。
- 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-*
呼び出される単一のXMLファイルを定義しました。device-config.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で検索」されないようにするために必要です。
(オプション)私がこれを行っている理由のより深い推論
実行時に使用されているバケットを知りたいというより深い理由は、私の単一フラグメントのすべての構成コードが、透過的ではなく、多くの場合、他のレイアウト...ある種のフラグメント継承が必要であるかのようでした...リンクをたどると、まさに私が行ったことです。これの欠点は、フレームワークにx、y、またはzフラグメントをインスタンス化するように指示する前に、使用している画面を知る必要があることです。作成されるフラグメントがレイアウトと同期しなくなることはありません。膨らませることを意味します。この継承は機能し、はるかに管理しやすいフラグメントスタックを可能にします(Sonarも幸せです。これは素晴らしいことです)。
概要
ただし、フレームワークが選択するレイアウトフォルダーと値フォルダーの間のこの明らかな不一致によって私は妨げられました。layout-sw600dp-land
それぞれが同じ修飾子を持っているので、 UI XMLを利用するアクティビティがvalues-sw600dp-land
リソースを使用しないのはなぜ ですか?上でリンクしたSOディスカッションに投稿された潜在的な解決策の中で最も近いものだったので、何か問題があったことを願っています。