標籤雲

搜尋此網誌

2015/12/07

在 View 顯示在畫面上之前得知尺寸

View 在被 inflate 出來後一直到被顯示在畫面上之前
如果我們想要利用 getWidth(), getHeight() 或 getMeasuredWidth(), getMeasuredHeight() 取得寬高值的話
拿到的結果會不如預期

這問題我相信很多人都碰過
今天在網路上剛好看到一些資訊就順手記在這裡吧

原來 View 在顯示到畫面上之前會經過 measure() 跟 requestLayout() 這兩個步驟
所以問題就在 measure 這個地方

View.measure (int widthMeasureSpec, int heightMeasureSpec)
用來決定一個 View 的大小
需要傳入寬與高的 MeasureSpec 常數,正常狀態下會由其 parent 提供
而查詢 View.MeasureSpec 後得知共有三種值:
* UNSPECIFIED 其值為 0 (0x00000000),其 parent 沒有對寬/高給予限制
* EXACTLY 其值為 1073741824 (0x40000000),其 parent 已經給了寬/高值
* AT_MOST 其值為 -2147483648 (0x80000000),在限制大小內可以為任意寬/高

所以如果我們只是想要預先知道這個 View 的尺寸
一般簡單情況下用 0 (即為 MeasureSpec.UNSPECIFIED) 就可以了
不過由於這不是真正放到 parent 後的大小,所以不保證是最後的大小歐

另外在 API level 17 級以下的版本裡,如果 View 的是用 RelativeLayout 的話
在 makeMeasureSpec 時 (onMeasure 裡面會呼叫到) 會有 bug 導致錯誤
所以請確定 API level 大於 17 或不是使用 RelativeLAyout 作為 view 的根

相關資料:
developer.android.com - View
developer.android.com - View.MeasureSpec

沒有留言: