Android获取View的宽高为0问题的解决方法
2017-03-21 17:13
537 查看
在activity中可以调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0。 所以只有上述条件都不成立时才能得到非0的width和height。
所以要想获取到的width和height为真实有效的 则有以下方法:
1、最优雅的方法:View.post()
runnable对象中的方法会在View的measure、layout等事件后触发。UI事件队列会按顺序处理事件,在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。
2、ViewTreeObserver
但是要注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener:
所以要想获取到的width和height为真实有效的 则有以下方法:
1、最优雅的方法:View.post()
final View view=...; ... view.post(new Runnable() { @Override public void run() { view.getHeight(); } });
runnable对象中的方法会在View的measure、layout等事件后触发。UI事件队列会按顺序处理事件,在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。
2、ViewTreeObserver
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.post(new Runnable() { public void run() { view.getHeight(); } }); } });
但是要注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener:
SDK Level < 16时使用 public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener) 在 SDK Level >= 16时使用 public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
相关文章推荐
- android 获取网络数据,回传到本地用TextView显示乱码问题解决方法
- android获取view宽高的几种方法,解决获取高宽为0问题
- Android动态添加View的问题解决方法
- android webview内容压线问题解决方法
- Android使用WebView无法定位问题的解决方法
- Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http:/
- 解决Android ImageView用setImageDrawable方法图片缩小的问题
- android webview loadData乱码问题解决方法
- 【android】把view保存为图片的方法以及解决保存后图片背景变黑色的问题
- 【ANDROID】Android 在oncreate() 方法中调用 findViewById 返回 null 问题的原因和解决方法
- 【android】从源码分析调用ViewPager的notifyDataSetChanged无刷新的问题及解决方法
- [android] viewpager获取当前view报空指针的解决方法
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- android Gallery与imageView 滑动冲突问题解决方法
- [android] viewpager获取当前view报空指针的解决方法
- android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
- android webview内容压线问题解决方法
- android的textview显示音标问题解决方法
- AndroidGUI29:用getDrawingCache方法获取ImageView中的图像需要注意的问题
- android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法