我们何时知道活动的观点何时布局

mdu*_*pls 4 android android-layout android-view android-activity

我有一个带有视图层次结构的Activity,如下所示:

<RelativeLayout>
    <LinearLayout>
        <GridLayout />
    </LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

顶部RelativeLayout占据整个屏幕,而LinearLayout占据屏幕的子集.我正在尝试设置GridLayout子视图的大小,使得n行和m列单元格的大小与n,m值以及LinearLayout的宽度和高度直接相关.

因此,例如,我正在尝试获取单元格的宽度和高度,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,在创建视图时,mLinearLayout.getMeasuredWidth()不会返回正确的大小.它总是返回实际设备的屏幕宽度,直到视图完全布局为止 - 在这种情况下为时已晚.我已经根据最初完全不正确的值给了我的孩子单元格视图的大小.

我的问题是 - 我怎么知道这些意见何时完全布局.我需要查询他们正确或实际测量的宽度/高度.

setContentView()创建视图并在理论上将它们排除在外.但他们的观点并不能保证在他们最终的正确位置/尺寸.

jee*_*eet 10

您可以将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.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个Activity上的onLayoutSet方法将是一种更优雅的方法. (5认同)