24

Android でのアクティビティの実際のコンテンツ領域の寸法を測定する良い方法を探しています。

ディスプレイの取得は常に機能します。単純に次のようにします。

Display display = getWindowManager().getDefaultDisplay();

また、画面全体のピクセル数を取得できます。もちろん、これは ActionBar、ステータス バー、またはアクティビティ自体の使用可能なサイズを減らすその他のビューを考慮していません。

アクティビティが実行されたら、次のことができます。

View content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);

アクティビティのコンテンツのみを取得します。しかし、onCreate() でこれを行うと、幅と高さが 0, 0 のビューになります。

onCreate 中にこれらの寸法を取得する方法はありますか? ステータスバーの測定値を取得し、それを合計表示サイズから差し引く方法があるはずだと思いますが、それを行う方法を見つけることができません. コンテンツウィンドウメソッドは、描画される前に常に幅/高さのないビューを返すため、これが唯一の方法だと思います。

ありがとう!

4

6 に答える 6

33

目的に応じて、レイアウトまたは事前描画リスナーを使用できます。たとえば、onCreate() では次のようになります。

final View content = findViewById(android.R.id.content);
content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //Remove it here unless you want to get this callback for EVERY
        //layout pass, which can get you into infinite loops if you ever
        //modify the layout from within this method.
        content.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        //Now you can get the width and height from content
    }
});

API 16 の更新は非推奨です。removeGlobalOnLayoutListener

への変更: content.getViewTreeObserver().removeOnGlobalLayoutListener(this)

于 2013-09-18T03:17:44.163 に答える
19

(関連する質問への私の回答からコピー)

私は次の手法を使用します-onCreate()ビューが作成されたときに実行されるランナブルを投稿します:

    contentView = findViewById(android.R.id.content);
    contentView.post(new Runnable()
    {
        public void run()
        {
            contentHeight = contentView.getHeight();
        }
    });

このコードは、終了後にメイン UI スレッドで実行されますonCreate()

于 2014-01-29T08:50:54.350 に答える
2

これは重複した質問のようです。このSOの質問にはエレガントな答えがあります:

ビューの getWidth() および getHeight() は 0 を返します

onCreate() の直後に起動するように見える onWindowFocusChanged() をオーバーライドする (恥知らずにコピーされた) ものと、サイズがレンダリングされる場所:

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  //Here you can get the size!
 }
于 2015-08-06T14:10:23.270 に答える