1.概要:
Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的
2.问题提出:
如果开发一些依赖于UI控件的宽和高的功能,开发者可能会用到View的getHeight()和getWidth()方法。试图在Activity的
onCreate()方法中获取控件的宽和高。遗憾的是如果开发者在onCreate()方法中调用上述方法,会发现返回值都是0.
3.解释问题原因:
当onCreate()方法被调用时,会通过LayoutInflater将XML布局文件填充到ContentView。填充过程只包括创建试图,却不包括设置其大小。
那么试图的大小事在何时指定的呢?
Android开发文档的解释如下所示:
绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由 measure(int, int) 方法完成,该方法从上到下遍历视图
树。在递归遍历过程中,每个视图都会向下层传递尺寸和规格。当measure 方法遍历结束时,每个视图都保存了各自的尺寸信息。第
二个过程由 layout(int, int, int, int) 方法完成,该方法也是由上而下遍历视图树,在遍历过程中,每个父视图通过测量过程的结果定位
所有子视图的位置信息。
4.结论如下:
只有在整个布局绘制完毕后,视图才能得到自身的高和宽,这个过程发生在onCreate()方法之后,因此,在此之前调用getHeight()和getWidth()
方法返回的结果都是0.
5.解决办法:
在UI线程当中去获取, 这就要涉及一个方法post()
代码:
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
+ " btn.getHeight()是-->>" + btn.getHeight()
+ " btn.getMeasuredWidth()" + btn.getMeasuredWidth()
+ " " + btn.getMeasuredHeight());
btn.post(new Runnable() {
@Override
public void run() {
System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
+ " btn.getHeight()是-->>" + btn.getHeight()
+ " btn.getMeasuredWidth()" + btn.getMeasuredWidth()
+ " " + btn.getMeasuredHeight());
}
});
}
}
打印结果:
可以看到子啊post方法后就获取到View的值了
aaarticlea/png;base64,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" alt="" width="557" height="98" />
其实post方法是子线程访问UI线程的方法,这还提供了其他方法访问主线程,如果你想在
子线程当中改变UI线程的界面就可以用以下方法
相关知识参考地址:http://stackoverflow.com/questions/13840007/what-exactly-does-the-post-method-do
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable,long)
- Handler
- 如何在onCreate方法中获取视图的宽度和高度
你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当 ...
- Android 开发 Activity里获取View的宽度和高度 转载
原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...
- 解决在onCreate()过程中获取View的width和Height为0的4种方法
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid ...
- 解决在onCreate()过程中获取View的width和Height为0的方法
最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章 ...
- 在js中获取上传图片的宽度和高度
Html: <input type="file" id="MapUploadTd" onchange="getMapPictureSize(th ...
- Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?
在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...
- 如何在onCreate中获取View的高度和宽度
如何在onCreate中获取View的高度和宽度 原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&mid=2247483676&am ...
- Activity中获取view的高度和宽度为0的原因以及解决方案
在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得 ...
- android应用程序中获取view 的位置
1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...
随机推荐
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- MySQL 优化器
(system@127.0.0.1:3306) [trunk]> show variables like '%performance_sch%';+----------------------- ...
- Python中调用设置环境变量的bat
工作中用到一个python脚本,自动化运行某目录下的多个vc工程代码. 编译工程代码的命令如下,直接运行会失败,系统找不到devenv,我们需要添加devenv.exe所在的目录到环境变量中. os. ...
- 解决sever 2008中tomcat的报错 init Failed to initialize end point associated with ProtocolHandler ["http-nio-80"]
错误现象: 01-Aug-2017 14:59:50.140 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing Protoc ...
- Dynamics CRM early binding and late binding
The key advantage of late bound entity classes is that customer entities and attributes not avaliabl ...
- python's twenty eithth day for me 模块和包
模块: 什么是模块: 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,但其实import加载的模块分为四个通用类别: 1,使用python编写的代码 ...
- Java微信公众平台开发(十五)--微信JSSDK的使用
转自:http://www.cuiyongzhi.com/post/63.html 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的 ...
- 【HDU4301】Divide Chocolate
题意 有一块n*2的巧克力,将它分成k块,问有多少种方法. 分析 emmm是dp没错了. 最容易想到的状态定义是f[i][j],意思是前i行,分成j块的方案数.但是发现没法转移.(后面会说一下为什么· ...
- codeforce469DIV2——C. Zebras
题意 0, 010, 01010 这一类的01交替且开头和结尾都为0的序列被称为zebra序列.给出一段01序列,尝试能否把他分为k个子序列使得每个子序列都是zebra序列. 分析 这个题应该算是水题 ...
- 【codevs2495】水叮当的舞步
题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ ...