前言
原創文章,歡迎轉載,請保留出處。
有任何錯誤、疑問或者建議,歡迎指出。
我的郵箱:[email protected]
Android下View必須實作
onMeasure
,
onLayout
(ViewGroup實作),
onDraw
(View實作,ViewGroup調用子View的onDraw)三個方法,要動态擷取View的高度(或寬度)就必須要了解這三個方法的調用的時間。
兩個方法的使用
以高度為例,動态擷取View的高度有兩個比較友善的方法getHeight()和getMeasuredHeight(),下面說說兩種方法的使用條件和注意事項:
getHeight() 方法
這個方法必須要在View調用了onLayout方法後才能獲得,為了監聽onLayout方法,可以獲得ViewTree觀察者上的監聽器來實作,具體代碼為:
view.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener(){
@override
public void onGlobalLayout(){
//隻需要擷取一次高度,擷取後移除監聽器
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
//這裡高度應該定義為成員變量,定義為局部為展示代碼友善
int height = view.getHeight();
}
});
注意:關于
removeGlobalOnLayoutListener
這個方法過時,可以采用
removeOnGlobalLayoutListener
這個高API Level才支援的方法。
getMeasuredHeight() 方法
由方法的名字就可以得知這個方法必須要在View調用了onMeasure方法後才能獲得,有一種快捷的方法可以通知系統主動測量View(調用onMeasure),代碼如下:
view.measure(,);//通知系統主動測量
int height = view.getMeasuredHeight();
注意:有些人使用measure(0,0)方法時抛空指針異常,這是因為你的view對象根節點的布局已經實作了onMeasure方法,比如RelativeLayout重寫了onMeasure方法,可以換成LinearLayout這種沒有重寫此方法的布局,當然也可以在外再套一層LinearLayout,不過這樣會增加布局層數,降低運作效率,這需要自行權衡,如果有更好的方法歡迎告訴我。
2015年9月24日追加:這個問題好像不一定會出現,我在Item布局中設定RelativeLayout中嵌入ImageView,調用ImageView的measure(0,0)方法沒有抛空指針,HeaderView之前試過會出現。
找到了一篇文章:http://blog.csdn.net/ljz2009y/article/details/18351491
API 17 以下會出現這個BUG