2010-12-21 78 views
4

簡單的問題,也許令人沮喪 - 複雜但希望 - 簡單的答案?獲取實際的視圖高度

獲得大小設置爲FILL_PARENT的元素的實際高度的「最佳實踐」是什麼?

+2

這可能是這太問題的重複:http://stackoverflow.com/questions/2864331/how-to-get-an-android-widgets-size-after-layout-is-calculated – 2010-12-21 17:04:05

+0

謝謝 - 我的搜索fu已經離開過節。我將首先嚐試下面的答案,但有很多選擇。 – 2010-12-21 18:22:39

回答

17

肯定比看起來應該更復雜。與建議問題中的答案相比,我發現的更簡單的方法是使用ViewTreeObserver。在您的onCreate()方法,你可以使用一些代碼如下所示:

TextView textView = (TextView)findViewById(R.id.my_textview); 
ViewTreeObserver observer = textView.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

適合我 - 謝謝。唯一需要注意的是,您需要注意一次(或僅在需要時)進入事件的事實 - 否則,您將最終進入無盡的佈局循環。 – 2010-12-21 19:56:40

2

只是一個額外的修正上述回答,如果你需要在視圖中執行任何操作多個部件的尺寸。在佈局完成時,將爲每個視圖調用佈局偵聽器。直到根視圖組件(即子元素生成佈局事件,然後父元素生成其佈局事件)爲止,這是遞歸的。這意味着您可以簡單地掛接根視圖組件的佈局事件,以便在任何視圖的佈局更改時得到通知。

ViewTreeObserver observer = this.findViewById(android.R.id.content).getViewTreeObserver(); 

現在你可以指望所有的意見將在onGlobalLayout設置寬度和高度值,因爲他們都進行了佈局。對於需要暴露實際維度的每個視圖創建許多偵聽器(顯然,除非您必須具有哪個視圖生成事件的範圍,而這通常不是必需的),這顯然更適合於創建多個偵聽器。