1

表示領域を完全に管理したいAndroidアプリケーションがあるとしましょう。これにより、サブコントロールのサイズを調整できます(実行時に、XMLは使用できません。サブコントロールのサイズをその場で積極的に変更する必要があります)。

このアプリケーションは横向きでのみ実行され、キーボード入力は行われないため、使用可能な領域が変わることはありません。

表示するサイズは、この使用可能領域に基づいて計算されます。たとえば、1つのアイテムは使用可能領域の左半分を正確に占めることであり、右半分は他のアイテム間で厳密な比率で分割されます。フォントサイズも、アイテムに正しく収まるように調整されます。

私の最初の考えは、main.xmlにコンテンツのないグリッドレイアウトだけを提供することでしたが、最大サイズ(fill_parentまたは同様のもの)に拡張するように構成されました。グリッドレイアウトを使用して物を配置しますが、サイズを制御することで、レイアウトマネージャーが物を表示する方法が決まります。

うまくいけば、適切な時間(初期化後、描画前)にグリッドレイアウトをクエリして解像度を取得し、それに基づいて将来のすべての描画を調整できます。

これを行うためのより良い方法はありますか?XMLはコンテンツをプレゼンテーションから分離することを目的としていますが、この特定のクライアントはレイアウトを完全に制御したいと考えており、必要に応じて、コードを実行できるデバイスを制限します(社内アプリなので、指示できます)。

私が持っていたもう1つの考えは、偽のサイズでXML内のすべてのサブコントロールを追加することでした(すべてが常に存在し、変更される可能性があるのはサイズだけです)。ただし、そうすることで、使用可能な領域を取得できなくなり、サイズをインテリジェントに調整できるかどうかはわかりません。

4

1 に答える 1

3

resolutionとの間で混同していますかdensity。「使用可能なディスプレイ解像度」とは何ですか?各デバイスの解像度はピクセル単位で1つだけです。

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

final int height = dm.heightPixels;
final int width = dm.widthPixels;

ただし、表示する内容は、密度と表示サイズの影響を受ける解像度の比率によって異なります。

(更新しました)

(1)フルスクリーンモードでの開始を確認し、すべてのタイトルバーまたは通知バーを非表示にするには:

    // Remove title bar
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    // Remove notification bar
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

(2)ビューRectを取得するには:

    Rect rect = new Rect();
    Window window = getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
于 2012-09-07T03:58:55.820 に答える