天天看点

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

很经常当我们动态创建某些view时,需要通过获取他们的width和height来确定别的view的布局,但是在oncreate()获取view的width和height会得到0.view.getwidth()和view.getheight()为0的根本原因是控件还没有完成绘制,你必须等待系统将绘制完view时,才能获得。这种情况当你需要使用动态布局(使用wrap_content或match_parent)就会出现。一般来讲在activity.oncreate(...)、onresume()方法中都没有办法获取到view的实际宽高。所以,我们必须用一种变通的方法,等到view绘制完成后去获取width和height。下面有一些可行的解决方案。

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

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

在 sdk lvl < 16时使用 public void removeglobalonlayoutlistener (viewtreeobserver.ongloballayoutlistener victim) 在 sdk lvl >= 16时使用 public void removeongloballayoutlistener (viewtreeobserver.ongloballayoutlistener victim)

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

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

这个方法比viewtreeobserver好:

1、你的代码只会执行一次,而且你不用在在每次执行后将observer禁用,省心多了。

2、语法很简单

参考:

<a href="http://stackoverflow.com/a/3602144/774398" target="_blank">http://stackoverflow.com/a/3602144/774398</a>

<a href="http://stackoverflow.com/a/3948036/774398" target="_blank">http://stackoverflow.com/a/3948036/774398</a>

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

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

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

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

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获得。

参考链接

https://stackoverflow.com/questions/3591784/getwidth-and-getheight-of-view-returns-0/24035591#24035591

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/4133927.html