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()
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()
相关文章推荐
- Android下动态获取View的高度或宽度
- Android下动态获取View的高度或宽度
- Android获取View的宽度和高度
- IOS动态获取文本的高度--自适应文本宽度、高度Textview
- android中获取view在布局中的高度和宽度
- android在onCreate()方法中获取View的宽度与高度的方法实战
- android关于代码中动态设置view的高度宽度的问题
- Android获取屏幕或View宽度和高度的方法
- 动态的获取和设置ImageView的宽度和高度
- android TextView 如何动态获取宽度
- Android UI之代码动态设置ImageView的宽度和高度
- Android 获取View高度宽度
- android开发步步为营之101:动态调整view的宽度和高度以及在页面的坐标位置
- Android在onCreate()方法中动态获取TextView控件的高度
- 如何使用代码动态的获取和设置ImageView的宽度和高度?
- android 动态设置获取控件大小,并设置宽度等于高度,或者高度等于宽度。
- Wiki_Android_获取ImageView的最大最小宽度和高度
- 转--如何使用代码动态的获取和设置ImageView的宽度和高度?
- 如何使用代码动态的获取和设置ImageView的宽度和高度?
- 动态获取和设置ImageView的宽度和高度