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()

代码:

 1 public class MainActivity extends Activity {
 2     private Button btn;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         btn = (Button) findViewById(R.id.btn);
 8         System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
 9                 + "   btn.getHeight()是-->>" + btn.getHeight()
10                 + "   btn.getMeasuredWidth()" + btn.getMeasuredWidth()
11                 + "   " + btn.getMeasuredHeight());
12         btn.post(new Runnable() {
13             @Override
14             public void run() {
15                 System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
16                         + "   btn.getHeight()是-->>" + btn.getHeight()
17                         + "   btn.getMeasuredWidth()" + btn.getMeasuredWidth()
18                         + "   " + btn.getMeasuredHeight());
19             }
20         });
21     }
22
23 }

打印结果:

可以看到子啊post方法后就获取到View的值了

其实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
时间: 2024-10-10 06:28:02

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

如何在onCreate方法中获取视图的宽度和高度

你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当onCreate被调用的时候,视图的内容正在被LayoutInflater来填充xml布局. 这个过程会填充布局,但是暂时不会设置视图的大小. 那么视图到底什么时候获得自己的大小尺寸呢? 实际上是在Layout以后,而layout又是在onCreate调用以后. 那么,如果我们要在onCreate方

android安卓onCreate方法中获取控件宽度高度

ViewTreeObserver vto = imageView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this); int height=imageView.getHeight();

解决在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()方法中

通过MeasuerSpec获取View的宽度和高度

在onCreate中无法通过getHeight方法获取View的宽高.我们可以通过MeasureSpec实现. int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); textView.measure(w, h); int width =textView.ge

android 在onCreate方法中获得view的宽高

view在绘制完成后才会有自己的宽高,所以在onCreate中要获得view的宽高可以通过以下4中方法: 1.ViewTreeObserver:监听界面绘制事件,在layout时调用,使用完毕后记得removeListener 2.view.post,因为runnable对象会在view的measure.layout后触发 3.重写onLayout方法 4.使用getMeasuredWidth.getMeasuredHeight获得测量后的宽高,可能跟view的真实宽高有差距

JavaScript与jQuery中获取屏幕的宽度和高度的常用方法以及HTML中精确定位

浏览器的宽高示意图: JavaScript中常用的方法: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offsetWidth (包括边线的宽) 网页可见区域高: document.body.offsetHeight (包括边线的高) 网页正文全文宽: document.body.scrollWidth 网页正文全文高: document.body.scr

Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_view); myview = ViewUtils.find(this, R.id.myview); getViewSize("onCr

在Activity中onCreate方法里面获取空间宽度和高度的新姿势

以前获取一个View的宽度和高度,总是在Activity中的onCreate方法中获取不到,那么我们怎么在onCreate方法中获取到控件的宽度和高度呢? 方法:用View中的post方法- 代码如下: public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConten

如何在onCreate()方法中,获取得到控件的宽度和高度?小意思!

在onCreate()方法中,如果想获得控件的宽度高度,那就要使用下面的方法了. orderTime.post(new Runnable() { @Override public void run() { System.out.println("高"+orderTime.getHeight()); System.out.println("宽"+orderTime.getWidth()); } }); 其中,orderTime是一个TextView.当然,这里只是一个