我有一个具有视图层次结构的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()创建视图并在理论上将它们排除在外。但他们的观点并不能保证在他们最终的正确位置/尺寸。
答案 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() {
...
}
}