您的位置:首页 > 移动开发 > Android开发

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

2018-02-27 17:34 375 查看
Android 动态获取各种View的高度和宽度


Android下View必须实现onMeasure,onLayout(ViewGroup实现),onDraw(View实现,ViewGroup调用子View的onDraw)三个方法,要动态获取View的高度(或宽度)就必须要理解这三个方法的调用的时间。


1.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才支持的方法。



2.getMeasuredHeight() 方法

方法的名字就可以得知这个方法必须要在View调用了onMeasure方法后才能获得,有一种快捷的方法可以通知系统主动测量View(调用onMeasure),代码如下:

view.measure(0,0);//通知系统主动测量

int height =  view.getMeasuredHeight()

注意:有些人使用measure(0,0)方法时抛空指针异常,这是因为你的view对象根节点的布局已经实现了onMeasure方法,比如RelativeLayout重写了onMeasure方法,可以换成LinearLayout这种没有重写此方法的布局,当然也可以在外再套一层LinearLayout,不过这样会增加布局层数,降低运行效率


原因:
翻下来就是说:
在android系统版本在17级以下(包含17的时候)。使用measure会出现NULL异常情况,这个是一个BUG。原因是在RelativeLayout的控件使用在含有scrolling的时候,该含有scrolling的控件中计算空间大小的时候,没有使用MeasureSpec mode UNSPECIFIED的布局方式在RelativeLayout。自定义的控件则会尽可能的使用AT_MOST 来替换对齐方式。

如果你想解决这个问题有2个方法:

        1.讲SDK的目标版本升级


        2.将需要使用RelativeLayout的上层包一个LinearLayout即可


3.在activity进入运行期时,组件的尺寸获取方法就很简单了,直接getWidth()和getHeight()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息