我们什么时候知道什么时候一个活动的意见已经奠定了

问题描述:

我有一个视图层次的活动如下:我们什么时候知道什么时候一个活动的意见已经奠定了

<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. 
    } 
} 
+0

对我来说这似乎并不幸福 - 这似乎是一个很好的方式来了解布局在做什么。 – 2012-04-16 22:09:56

+0

是的,这是一种让人了解布局正在做什么的优雅方式。 – mdupls 2012-04-17 10:37:32

+5

Activity上的onLayoutSet方法将是一种更加优雅的方式。 – zmbq 2012-08-21 11:05:55

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

public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener { 

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

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

}