4

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

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

顶部的 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);

不幸的是,在创建视图时,mLLinearLayout.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 回答