我们什么时候知道活动的意见何时布局

时间:2012-04-16 16:46:51

标签: android android-layout android-activity android-view

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

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

当LinearLayout占据屏幕的子集时,顶部RelativeLayout占据整个屏幕。我正在尝试设置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);

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

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

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

2 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分:2)

扩展jeet的答案,你可以让你的活动实现监听器,这会导致更好的代码。

public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener {

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

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

}