我们什么时候知道什么时候一个活动的意见已经奠定了
问题描述:
我有一个视图层次的活动如下:我们什么时候知道什么时候一个活动的意见已经奠定了
<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);
不幸的是,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() {
...
}
}
对我来说这似乎并不幸福 - 这似乎是一个很好的方式来了解布局在做什么。 – 2012-04-16 22:09:56
是的,这是一种让人了解布局正在做什么的优雅方式。 – mdupls 2012-04-17 10:37:32
Activity上的onLayoutSet方法将是一种更加优雅的方式。 – zmbq 2012-08-21 11:05:55