Android 我们什么时候知道什么时候有活动';他的观点已经被展示出来了

Android 我们什么时候知道什么时候有活动';他的观点已经被展示出来了,android,android-layout,android-activity,android-view,Android,Android Layout,Android Activity,Android View,我有一个具有如下视图层次结构的活动: <RelativeLayout> <LinearLayout> <GridLayout /> </LinearLayout> </RelativeLayout> int linearLayoutWidth = mLinearLayout.getMeasuredWidth(); int linearLayoutHeight = mLinearLayout.getMea

我有一个具有如下视图层次结构的活动:

<RelativeLayout>
    <LinearLayout>
        <GridLayout />
    </LinearLayout>
</RelativeLayout>
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()创建视图并从理论上进行布局。但它们的视图还不能保证处于最终正确的位置/大小。

您可以将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.
    }
}

扩展jeet的答案,您可以让您的活动实现侦听器,从而生成稍微好一点的代码

public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener {

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

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

}

这对我来说似乎并不不幸——这似乎是一种了解版面正在做什么的优雅方式。是的,这是一种了解版面正在做什么的优雅方式。活动的onlyointer方法将是一种更优雅的方式。