解决在onCreate()过程中获取View的width和Height为0的4种方法

转载 2015年12月15日 19:15:18
转自:http://www.cnblogs.com/kissazi2/p/4133927.html

1、监听Draw/Layout事件:ViewTreeObserver

ViewTreeObserver监听很多不同的界面绘制事件。一般来说OnGlobalLayoutListener就是可以让我们获得到view的width和height的地方.下面onGlobalLayout内的代码会在View完成Layout过程后调用。

 1 view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
 2         @Override
 3         public void onGlobalLayout() {
 4             mScrollView.post(new Runnable() {
 5                 public void run() {
 6                     view.getHeight(); //height is ready
 7                 }
 8             });
 9         }
10 });

但是要注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener:

在 SDK Lvl < 16时使用
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

在 SDK Lvl >= 16时使用
public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

2、将一个runnable添加到Layout队列中:View.post()

这个解决方案是我最喜欢的,但是几乎没人知道有这个方法。简单地说,只要用View.post()一个runnable就可以了。runnable对象中的方法会在View的measure、layout等事件后触发,具体的参考Romain Guy

UI事件队列会按顺序处理事件。在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。

1 final View view=//smth;
2 ...
3 view.post(new Runnable() {
4             @Override
5             public void run() {
6                 view.getHeight(); //height is ready
7             }
8         });

这个方法比ViewTreeObserver好:
1、你的代码只会执行一次,而且你不用在在每次执行后将Observer禁用,省心多了。
2、语法很简单


参考:
http://stackoverflow.com/a/3602144/774398
http://stackoverflow.com/a/3948036/774398

 

3、重写View的onLayout方法

这个方法只在某些场景中实用,比如当你所要执行的东西应该作为他的内在逻辑被内聚、模块化在view中,否者这个解决方案就显得十分冗长和笨重。

1 view = new View(this) {
2     @Override
3     protected void onLayout(boolean changed, int l, int t, int r, int b) {
4         super.onLayout(changed, l, t, r, b);
5         view.getHeight(); //height is ready
6     }
7 };

需要注意的是onLayout方法会调用很多次,所以要考虑好在这个方法中要做什么,或者在第一次执行后禁用掉你的代码。

 

附加:获取固定宽高

如果你要获取的view的width和height是固定的,那么你可以直接使用:

1 View.getMeasureWidth()
2 View.getMeasureHeight()

但是要注意,这两个方法所获取的width和height可能跟实际draw后的不一样。官方文档解释了不同的原因

View的大小由width和height决定。一个View实际上同时有两种width和height值。

第一种是measure width和measure height。他们定义了view想要在父View中占用多少width和height(详情见Layout)。measured height和width可以通过getMeasuredWidth() 和 getMeasuredHeight()获得。

第二种是width和height,有时候也叫做drawing width和drawing height。这些值定义了view在屏幕上绘制和Layout完成后的实际大小。这些值有可能跟measure width和height不同。width和height可以通过getWidth()和getHeight获得。

 


如何解决在onCreate()中获取View的width和Height为0?

当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0. view.getWidth...
  • cxc19890214
  • cxc19890214
  • 2016年08月25日 17:52
  • 438

onCreate中View的width,height为0的问题

当我们在onCreate()回调方法中去调用View的getWidth()、getHeight()、getTop()、getLeft()等方法的时候,是无法获取到正确值的,此时只会返回0。   为什么...
  • codezjx
  • codezjx
  • 2015年04月28日 20:08
  • 2566

解决在onCreate()过程中获取View的width和Height为0的4种方法

很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid...
  • u011513914
  • u011513914
  • 2015年04月17日 11:36
  • 330

onCreate()方法中获取View的宽高为0的原因及解决方法

如果需要开发一些需要依赖UI控件的宽度和高度的功能,很多人可能会用到View的getHeight()和getWidth()方法。对于新手来说这里会有一个小小的陷阱需要注意。如果你试图在onCreate...
  • yabg_zhi_xiang
  • yabg_zhi_xiang
  • 2016年05月05日 17:53
  • 762

在onCreate()过程中获取View的width和Height为0的4种解决方法

转自 http://www.cnblogs.com/kissazi2/p/4133927.html 很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的...
  • lue2009
  • lue2009
  • 2015年06月11日 10:06
  • 385

解决在onCreate()过程中获取View的width和Height为0的几种方法

在onCreate()获取view的width和height会得到0的解决办法
  • wocena
  • wocena
  • 2016年11月03日 13:25
  • 203

android onCreate中获取view宽高为0的多种解决方法

这个问题大家肯定遇到过不止一次,其实很简单,解决它也很容易,但是咱们追求的毕竟不是解决它,而是找到几种方法去解决,并且这么解决的原理是什么。   这里列出4种解决方案:Activity/View#o...
  • zhao_zepeng
  • zhao_zepeng
  • 2015年12月23日 16:53
  • 4379

关于chrome,firefox中img.width=0,img.height=0的解决方法

今天修改网站的上传头像时,谷歌浏览器中放大缩小图片,图像消失的bug。 调试时发现动态处理图片时有问题: var img = new Image(); img.src = $("#xxx")....
  • ameol
  • ameol
  • 2013年05月03日 17:59
  • 7562

实现杂记(27):解决在onCreate()过程中获取View的width和Height为0的4种方法

PS:这个文章是站在巨人的肩膀上抄袭的,之所以再次写,我是想分析:到底是在什么时候拿到宽高 下面的三种方法都经过实际测试,都是可以用的,输出结果如下: 从这个结果可以看出,都是...
  • u014737138
  • u014737138
  • 2016年07月01日 10:42
  • 249

React-Native 基础(五) Height and Width

参考文档:http://facebook.github.io/react-native/docs/height-and-width.html1. Fixed Dimension 静态尺寸 React...
  • KevinsCSDN
  • KevinsCSDN
  • 2016年07月29日 12:30
  • 555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决在onCreate()过程中获取View的width和Height为0的4种方法
举报原因:
原因补充:

(最多只允许输入30个字)