HackThirteen 在onCreate()方法中获取View的宽度和高度

时间:2023-03-10 02:50:24
HackThirteen 在onCreate()方法中获取View的宽度和高度

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://*.com/questions/13840007/what-exactly-does-the-post-method-do
  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable,long)
  • Handler