Android下动态获取View的高度或宽度

前言

原创文章,欢迎转载,请保留出处。
有任何错误、疑问或者建议,欢迎指出。
我的邮箱:[email protected]

Android下View必须实现onMeasureonLayout(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(0,0);//通知系统主动测量
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

你可能感兴趣的:(android开发)