天天看點

解決在onCreate()過程中擷取View的width和Height為0的4種方法

很經常當我們動态建立某些view時,需要通過擷取他們的width和height來确定别的view的布局,但是在oncreate()擷取view的width和height會得到0.view.getwidth()和view.getheight()為0的根本原因是控件還沒有完成繪制,你必須等待系統将繪制完view時,才能獲得。這種情況當你需要使用動态布局(使用wrap_content或match_parent)就會出現。一般來講在activity.oncreate(...)、onresume()方法中都沒有辦法擷取到view的實際寬高。是以,我們必須用一種變通的方法,等到view繪制完成後去擷取width和height。下面有一些可行的解決方案。

解決在onCreate()過程中擷取View的width和Height為0的4種方法
解決在onCreate()過程中擷取View的width和Height為0的4種方法

但是要注意這個方法在每次有些view的layout發生變化的時候被調用(比如某個view被設定為invisible),是以在得到你想要的寬高後,記得移除ongloblelayoutlistener:

在 sdk lvl < 16時使用 public void removeglobalonlayoutlistener (viewtreeobserver.ongloballayoutlistener victim) 在 sdk lvl >= 16時使用 public void removeongloballayoutlistener (viewtreeobserver.ongloballayoutlistener victim)

ui事件隊列會按順序處理事件。在setcontentview()被調用後,事件隊列中會包含一個要求重新layout的message,是以任何你post到隊列中的東西都會在layout發生變化後執行。

解決在onCreate()過程中擷取View的width和Height為0的4種方法
解決在onCreate()過程中擷取View的width和Height為0的4種方法

這個方法比viewtreeobserver好:

1、你的代碼隻會執行一次,而且你不用在在每次執行後将observer禁用,省心多了。

2、文法很簡單

參考:

<a href="http://stackoverflow.com/a/3602144/774398" target="_blank">http://stackoverflow.com/a/3602144/774398</a>

<a href="http://stackoverflow.com/a/3948036/774398" target="_blank">http://stackoverflow.com/a/3948036/774398</a>

這個方法隻在某些場景中實用,比如當你所要執行的東西應該作為他的内在邏輯被内聚、子產品化在view中,否者這個解決方案就顯得十分冗長和笨重。

解決在onCreate()過程中擷取View的width和Height為0的4種方法
解決在onCreate()過程中擷取View的width和Height為0的4種方法

需要注意的是onlayout方法會調用很多次,是以要考慮好在這個方法中要做什麼,或者在第一次執行後禁用掉你的代碼。

如果你要擷取的view的width和height是固定的,那麼你可以直接使用:

view的大小由width和height決定。一個view實際上同時有兩種width和height值。

第一種是measure width和measure height。他們定義了view想要在父view中占用多少width和height(詳情見layout)。measured height和width可以通過getmeasuredwidth() 和 getmeasuredheight()獲得。 第二種是width和height,有時候也叫做drawing width和drawing height。這些值定義了view在螢幕上繪制和layout完成後的實際大小。這些值有可能跟measure width和height不同。width和height可以通過getwidth()和getheight獲得。

參考連結

https://stackoverflow.com/questions/3591784/getwidth-and-getheight-of-view-returns-0/24035591#24035591

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/kissazi2/p/4133927.html