1. ホーム
  2. アンドロイド

[解決済み】レイアウトが描画されたことを確認する方法は?

2022-04-07 18:34:37

質問

スクロール可能なビットマップを画面に描画するカスタムビューがあります。それを初期化するために、私は親レイアウトオブジェクトのピクセル単位のサイズを渡す必要があります。しかし、onCreateとonResume関数の間、レイアウトはまだ描かれていないため、layout.getMeasuredHeight()は0を返します。

回避策として、1秒待って測定するハンドラを追加しました。これは動作しますが、ずさんで、レイアウトが描画される前に終了するまでにどれだけ時間を短縮できるのか見当もつきません。

私が知りたいのは、レイアウトが描画されたことを検出するにはどうすればいいのか、ということです。イベントやコールバックがあるのでしょうか?

解決方法は?

レイアウトにツリーオブザーバーを追加することができます。これにより、正しい幅と高さが返されるはずです。 onCreate() は、子ビューのレイアウトが行われる前に呼び出されます。そのため、幅と高さはまだ計算されていません。高さと幅を得るには、これを onCreate() メソッドを使用します。

    final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
    ViewTreeObserver vto = layout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    layout.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                } else {
                    layout.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                }
            int width  = layout.getMeasuredWidth();
            int height = layout.getMeasuredHeight(); 

        } 
    });