天天看點

Android下動态擷取View的高度或寬度

前言

原創文章,歡迎轉載,請保留出處。
有任何錯誤、疑問或者建議,歡迎指出。
我的郵箱:[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

繼續閱讀