8

私は奇妙な問題があります。正しいリソースプロファイルを選択するのは、Androidのどの部分ですか?

私を怒らせるようになる前に、私はカスタムJelly Beanに取り組んでいます。したがって、「いつも素敵なアプローチ」がここではうまくいかず、汚い回避策を講じなければなりません。

私が持っている資産に次のものが含まAPK:

D/AppDemo(2091): measured width: 1920 PE width: 1920 scaleFactor = 1.0 
D/AppDemo(2091): [ANDROID] measured width: 1920 measured height: 1080 
D/AppDemo(2091): [ANDROID] scale for resources: 2.0 xdpi: 320.0 ydpi: 320.0 
D/AppDemo(2091): [ANDROID] screen density: xhdpi 
D/AppDemo(2091): [ANDROID] screen size: large 
D/AppDemo(2091): [ANDROID] using layout: layout-mdpi 

ので、評価指標を見て、なぜがlayout-large-xhdpiされていない:

layout 
layout-mdpi 
layout-land 
layout-large-mdpi 
layout-large-land-mdpi 
layout-large-hdpi 
layout-large-xhdpi 

そして、いくつかの他のメトリックコードは、これを返さロードされた?

私はこれを見ることができる場所を教えてください。私は本当にレイアウト/リソース/ AssetManagerに特定のレイアウトを読み込ませる方法を見つける必要があります。

私はこの問題で最も人気のあるコメントは、「あなたはlayout-xhdpiを持っていない理由/必要はありません、あなたはdrawable-xhdpilayout-largeを持つべきである」しかし、私と一緒にクマです承知しています。

私は非常に、どこを見て、何を探すかについての小さなヒントに感謝します。これまでのところ、AssetManagerは掘削/ロギングを開始する場所のようです。

layout-mdpiを省略すると、リソースが不足しているとアプリケーションがクラッシュします。このバグは、コードがxhdpiを返しても、mdpiと仮定しているようです。私はこれを見つけて、ICS上で行ったように自分のアプリが素敵に見えるように修正する必要があります:)

どのレイアウトが簡単な方法でロードされているのかを調べています - すべてのルートレイアウトはandroid:tagです。 setContentView(R.layout.main_layout)私はルート要素のタグをつかんで、どのフォルダがロードされたのか知っています。視覚的なフィードバックとは別に、これは最終的に私のデバイス構成と一致する必要があります。

ありがとうございます。

+2

あなたはその*応答を必要としませんが、私はあなたの最終目標の大まかな説明が、困難なルートを経由することなく、必要なものを得る方法を考えるのに役立つと信じています。 – Phil

+0

@ Phil:問題はどこかで不一致があるため、すべてのアプリが画面全体の左上の四半期のみを表示するという問題です。小さくなるのではなく(スケーリングが適切に機能する場合)、それらははるかに大きくなります。 いずれにしても、私はこれから再割り当てされているので、その終わりがあります。 – Shark

答えて

3

興味深い問題です。私は一見を持っていたが、それはすべてウサギの穴を少し下に行く。そのような答えはありませんが、おそらく私の分析は正しい方向にあなたを設定します。

私はsetContentViewフォワードから起こったことを見ました。明らかにその時点では密度に依存しないレイアウトリファレンス(例えばR.layout.main_layout)という言葉で話しており、後でAPKの特定のファイルへの参照に変わります。あなたの質問はいつ、どこにあるのですか?

私は、ランドスケープ/ポートレート修飾子を使用して、実行時に品質を変更できるようにしました。また、Androidソースを添付したデバッガを使用しました。

ここに流れがあります。

  1. Resources.getLayout(INT)
  2. Resources.loadXmlResourceParser(整数、文字列)
  3. Resources.getValue(INT、TypedValue、ブーリアン)
  4. AssetManager.getResourceValue(INT、INT、TypedValue、ブール)
  5. StringBlock.get(INT)
  6. StringBlock.nativeGetString(INT、INT)

後方に向かって作業しましょう。

ステップ6は、修飾された参照を返すネイティブ(C)メソッドです。 /res/layout-land/yourview.xml。しかし、そのパラメータはインデックスであり、これは私たちが横長か縦長かに基づいて変化します。

どこから来たのかを確認するには、手順4に戻ってください。このインデックスはTypedValue内のフィールドですが、このメソッドに渡されるときに最初は正しく設定されていません。

ステップ4では、渡されたTypedValueを変更してインデックスを適切に設定する別のネイティブメソッドAssetManager.loadResourceValue()を呼び出します。

多分あなたはそれを見るためにCを見ることができます。

+0

特に、[ResourceTypes.cpp](http://code.metager.de/source/xref/android/4.1.1/frameworks/base/libs/androidfw/ResourceTypes.cpp#getResource)から始めたい場合があります。密度関連の設定項目を見ることができますが、それはすぐに私の好みに合わせて複雑すぎます。 –

+0

ResourceTypesは面白そうに見え、自宅に近いストライキのようですが、奨励金を獲得したことをお祝いします:) – Shark

+0

ありがとうございました。候補コンフィグレーションを比較するメソッドisBetterThanがあることがわかります。後で実行するロジックも含まれている可能性があります。私は彼らの候補者がどこから来ているかを考え出すことはできませんでした。 –

1

私はあなたが正しくなるかどうかわかりません。カスタムAndroidOSを構築していて、このカスタムAndroidOSに常にlayout-large-xhdpiの同じレイアウトリソースを読み込ませますか?

もしそうなら、あなたはConfiguration Classをカスタマイズしていると思います。素早く汚れていれば、72行目以降のint-Constantsをオーバーライドできます。

コンクリート、変更:

.... 
100  public static final int SCREENLAYOUT_SIZE_LARGE = 0x03; 
108  public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04; 

へ:

.... 
100  public static final int SCREENLAYOUT_SIZE_LARGE = 0x04; 
108  public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04; 

他の方法は、コンストラクタとsetToDefaultsを上書きすることができた() - メソッド、それは常に同じscreenlayoutをロードするようにします。

私はそれを試していない、私はそれが動作しているかわからない、私は信頼できる公式ソース(除外Androidコード)がありますが、私はあなたを助けることができる願っています。

+0

収集したデータをご覧ください。それらはコンフィギュレーションクラスを使用して収集され、私のデバイスとマッチしました。それは良い画面と正しい密度を登録しますが、間違ったレイアウトフォルダを選びます。私は、レイアウトピッカーに素早く汚れた修正を探しています。 – Shark

4

Micromax Funbookのような市場にはハッキングされたデバイスがたくさんありますが、画面サイズは大きくなりますが、mdpiリソースを使用すると私はそれらを使って作業していて、非常にイライラしています。

アプリはそれだけでこのpraticularタブレットで作業していない他のすべてのデバイスに素晴らしい取り組んでいる述べたように、あなたが実装する必要があり、そのようなちょっと解決策は、あなたが上の最後のセグメントを読まなければならない

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

ここに掲載このページは間違いなく助けになるでしょう。

ここで要約すると、異なるリソースを使用して異なる名前の別々のレイアウトを作成することです。

システムではなくリソースピッキングプロセスを推進しています。時間がかかるかもしれませんが、確かに助けになるでしょう。

public class MyActivity extends Activity { 
    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(); 

     Configuration config = getResources().getConfiguration(); 
     if (config.smallestScreenWidthDp >= 600) { 
      setContentView(R.layout.main_activity_tablet); 
     } else { 
      setContentView(R.layout.main_activity); 
     } 
    } 
} 
+0

問題は、私のレイアウトフォルダがレイアウトsw600dpとレイアウトsw1000dpでしたが、どれも「起動しません」ということです。何かがうんざりしていますが、問題は私の手から出ているようです。 しかし、ここでは、統合されたレイアウトフォルダを持ち、手作業で正しいフォルダを選択するアプローチを使用しています。そうですか。 – Shark

+0

しかし、これらの 'res/layout-xlarge/main_activity.xml#3.2より前のタブレットの場合 ' ' res/layout-sw600dp/main_activity.xml#3.2およびそれ以上のタブレットでは、単に動作せず、選択されません。 – Shark

関連する問題