android在代码中获取view宽/高为0解决方法
2016-10-24 15:07
519 查看
在项目中,我们要在代码中获取view的宽高信息,有可能就会在onCreat或者onResume方法中去获取,原因就是view的measure过程与Activity的生命周期不是同步执行的,因此无法保证在onCreat,onResume,onStart时这个view是否已经测量完毕,如果没有测量完毕,得到的结果就是0。这里给出4种解决办法
(1) onWindowFocusChanged
onWindowFocusChanged含义就是view已经初始化完毕,这个时候去获取宽高就没问题了,但是要注意的是此方法会被调用很多次,当Activity的窗口失去或者得到焦点都会调用一次,也就是Activity onResume或onPause时都会调用。典型代码如下:
(2) view.post(runnable)
通过post将一个runnable投递到消息队列的尾部,然后等Looper调用此runnable的时候,view也就已经初始化好了,典型代码如下:
(3) viewTreeObserver
使用viewTreeObserver的众多回调可以完成这个功能,比如使用OnGlobalLayoutListener这个接口,当view树的状态发生改变或者view树的内部view的可见性发生改变时,onGlobalLayout方法会被调用,因此这是获取view宽高很好的时机。需要注意的是,伴随着view树状态改变onGlobalLayout会被调用很多次,典型代码如下:
(4) view.measure(intwidthMeasureSpec,intheightMeasureSpec)
通过手动对view的measure来得到view的宽高,这种方法比较复杂,要分情况处理,根据view的LayoutParams来分:
math_parent
无法测量,因为构造此种MeasureSpec需要知道parentSize,即父容器的剩余空间,而此时我们无法知道parentSize的大小,所以理论上测量不出view的大小。
具体数值(dp/px)
比如说宽高都是100px,如下:
wrap_content
(1) onWindowFocusChanged
onWindowFocusChanged含义就是view已经初始化完毕,这个时候去获取宽高就没问题了,但是要注意的是此方法会被调用很多次,当Activity的窗口失去或者得到焦点都会调用一次,也就是Activity onResume或onPause时都会调用。典型代码如下:
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus){ int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } }
(2) view.post(runnable)
通过post将一个runnable投递到消息队列的尾部,然后等Looper调用此runnable的时候,view也就已经初始化好了,典型代码如下:
@Override public void onStart() { super.onStart(); view.post(new Runnable){ @Override public void run(){ int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } } }
(3) viewTreeObserver
使用viewTreeObserver的众多回调可以完成这个功能,比如使用OnGlobalLayoutListener这个接口,当view树的状态发生改变或者view树的内部view的可见性发生改变时,onGlobalLayout方法会被调用,因此这是获取view宽高很好的时机。需要注意的是,伴随着view树状态改变onGlobalLayout会被调用很多次,典型代码如下:
@Override protected void onStart() { super.onStart(); ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } }); }
(4) view.measure(intwidthMeasureSpec,intheightMeasureSpec)
通过手动对view的measure来得到view的宽高,这种方法比较复杂,要分情况处理,根据view的LayoutParams来分:
math_parent
无法测量,因为构造此种MeasureSpec需要知道parentSize,即父容器的剩余空间,而此时我们无法知道parentSize的大小,所以理论上测量不出view的大小。
具体数值(dp/px)
比如说宽高都是100px,如下:
int widthMeasureSpec=MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY); int heightMeasureSpec=MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY); view.measure(widthMeasureSpec,heightMeasureSpec);
wrap_content
int widthMeasureSpec=MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST); int heightMeasureSpec=MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST); view.measure(widthMeasureSpec,heightMeasureSpec);
相关文章推荐
- [置顶] Android开发之viewpager导报错误解决方法:错误代码 Caused by: java.lang.ClassNotFoundException: Didn't find class
- [android] viewpager获取当前view报空指针的解决方法
- android onCreate中获取view宽高为0的解决方法
- android onCreate中获取view宽高为0的多种解决方法
- Android 签名打包出现的错误的解决方法以及代码中获取应用签名信息方法
- android 获取网络数据,回传到本地用TextView显示乱码问题解决方法
- android onCreate中获取view宽高为0的多种解决方法
- Android解决在onCreate()中获取View的width、Height为0的方法
- [android] viewpager获取当前view报空指针的解决方法
- Android 使用WebView 时获取数据出现编码不正确的解决方法
- Android获取View的宽高为0问题的解决方法
- android获取view宽高的几种方法,解决获取高宽为0问题
- android webview 调用本地java代码失败解决方法
- 在android中使用proguard混淆代码出现“Conversion to Dalvik format failed with error 1”错误的解决方法
- 在android中使用proguard混淆代码出现“Conversion to Dalvik format failed with error 1”错误的解决方法
- 关于Android用户定位获取location值为null的解决方法
- android webview goBack不起作用的解决方法
- AndroidGUI29:用getDrawingCache方法获取ImageView中的图像需要注意的问题
- android开发中出现Only the original thread that created a view hierarchy can touch its views.错误的解决方法
- Android google map 开发中使用mapview产生INSTALL_FAILED_MISSING_SHARED_LIBRARY错误的解决方法