2012-04-16 94 views
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); 

不幸的是,mLinearLayout.getMeasuredWidth()不會在創建視圖時返回正確的大小。它始終返回實際設備的屏幕寬度,直到視圖完全佈置完畢 - 在這種情況下,它已經太晚了。我已經根據最初完全不正確的值給予我的孩子的單元格大小。

我的問題是 - 我怎麼知道什麼時候視圖已經完全佈置。我需要查詢他們的正確或實際測量的寬度/高度。

setContentView()創建視圖並從理論上闡明它們。但他們的意見並不能保證在最終的正確位置/尺寸。

回答

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

2

擴展jeet的答案,你可以讓你的活動實現監聽器,這會導致更好的代碼。

public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener { 

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

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

} 
相關問題