4

次のようなビュー階層を持つアクティビティがあります。

<RelativeLayout>
    <LinearLayout>
        <GridLayout />
    </LinearLayout>
</RelativeLayout>

一番上の RelativeLayout は全画面を占有し、LinearLayout は画面のサブセットを占有します。n行とm列でセルのサイズがLinearLayoutのn、m値と幅と高さに直接関連するように、GridLayoutの子ビューのサイズを設定しようとしています。

たとえば、次のようにセルの幅と高さを取得しようとしています。

int linearLayoutWidth = mLinearLayout.getMeasuredWidth();
int linearLayoutHeight = mLinearLayout.getMeasuredHeight();
...

int rows = mGridModel.getRows() + 1;
int columns = mGridModel.getColumns() + 1;
int cellWidth = (int) (linearLayoutWidth / columns);
int cellHeight = (int) (linearLayoutHeight / rows);

残念ながら、mLinearLayout.getMeasuredWidth() は、ビューの作成時に正しいサイズを返しません。ビューが完全にレイアウトされるまで、常に実際のデバイスの画面幅を返します。この場合は手遅れです。最初は完全に正しくない値に基づいて、子供たちのセルビューにサイズをすでに与えています。

私の質問は、ビューが完全にレイアウトされたことをどのように知ることができるかです。正しいまたは実際に測定された幅/高さを照会する必要があります。

setContentView() はビューを作成し、理論的にレイアウトします。ただし、ビューが最終的に正しい位置/サイズになることはまだ保証されていません。

4

2 に答える 2

11

ViewObserver は任意のビューに追加できます。このオブザーバーには、レイアウトが配置されたときに呼び出されるコールバック メソッド onGlobalLayout があります。

ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //in here, place the code that requires you to know the dimensions.


         //this will be called as the layout is finished, prior to displaying.
    }
}
于 2012-04-16T17:03:19.647 に答える
2

jeet の答えを拡張すると、アクティビティにリスナーを実装させることができます。これにより、コードが少し良くなります。

public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        view.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        ...
    }

}
于 2015-11-13T16:17:54.227 に答える