8

奇妙な問題があります。

あなたが私を非難する考えに至る前に、私はカスタムのジェリービーンに取り組んでいます. したがって、「通常の適切なアプローチ」はここでは機能しない可能性があり、汚い回避策を講じる必要があります。

アセットに以下を含む APK があります。

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

そして、他のいくつかのメトリクス コードはこれを返しました:

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/Resource/AssetManagerに特定のレイアウトを強制的にロードする方法を見つける必要があります。

この問題に関する最も一般的なコメントは「あなたは必要ない/なぜあなたは持っているのですか、あなたは持ってlayout-xhdpiいるべきですか」ですが、ご容赦ください.drawable-xhdpilayout-large

どこを見て、何を探すべきかについての小さなヒントでも非常にありがたいです。これまでのところ、AssetManager掘り下げ/ロギングを開始する場所のようです。

を省略するlayout-mdpiと、アプリケーションがクラッシュし、リソースが不足します。バグは、コードが返されても、別の場所xhdpiを想定しているようmdpiです。これを見つけて修正する必要があるので、私のアプリは ICS の場合と同じように見栄えがします :)

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

前もって感謝します。

4

3 に答える 3

4

Micromax Funbookのように、画面サイズは大きいが mdpi リソースを使用するハッキングされたデバイスが市場にたくさんあります。

あなたが言ったように、あなたのアプリは他のすべてのデバイスでうまく機能していますが、この特定のタブレットでは機能していません.

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);
        }
    }
}  
于 2013-03-07T05:41:22.617 に答える
3

興味深い問題です。私は見ましたが、それはすべてうさぎの穴を少し下ります。そのような答えはありませんが、私の分析があなたを正しい方向に導くかもしれません.

setContentView私は前方から何が起こったのかを見ました。明らかに、その時点では、密度に依存しないレイアウト参照 (例: ) の観点から話していますがR.layout.main_layout、後で APK 内の特定のファイルへの参照に変換されます。あなたの質問はいつ、どこにありますか。

実行時に品質を変更できるように横向き/縦向きの修飾子を使用し、Android ソースを添付してデバッガーを使用しました。

これがフローで、何らかの方法で開始されます。

  1. Resources.getLayout(int)
  2. Resources.loadXmlResourceParser(int, String)
  3. Resources.getValue(int, TypedValue, boolean)
  4. AssetManager.getResourceValue(int, int, TypedValue, boolean)
  5. StringBlock.get(int)
  6. StringBlock.nativeGetString(int,int)

後ろ向きに取り組みましょう。

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

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

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

たぶん、そのためにCを見始めて、どうやってうまくいくかを見ることができます.

于 2013-03-06T19:38:44.773 に答える
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;

別の方法として、Constructor と setToDefaults()-Method をオーバーライドして、常に同じ画面レイアウトをロードすることもできます。

私はそれを試していません。それが機能しているかどうかはわかりません。また、信頼できるソースや公式のソース (公式の Android コードを除外) もありませんが、お役に立てれば幸いです。

于 2013-03-01T09:51:14.203 に答える