当开发中需要控件的宽度和高度时,我们可能首先想到view的getHeight( ) 和getWidth( ),但 在onCreate()中调用这两个方法时,高度和宽度返回0,因为在onCreate()中正在通过LayoutInflater加载xml布局,还没来得及测量他们的尺寸,得不到view的宽高,
依文档解释:
layout绘制是两个过程:测试view的尺寸和布置view的位置,测试实现measure(int ,int)依据view树从上往下依次进行,测试完成,view保存其measure信息,布置view通过layout(int,int,int,int)也是依据view树从上往下依次进行,依据view的尺寸来分配view的控件和位置。
其实就是两点
1.先确定view的大小尺寸,位置等信息
2.依据得到的信息排列布局
当加载布局的时候才能得到view的宽度和高度,先调用onCreate()才加载布局,因此,得到的宽和高为0,就如同我们包饺子,饺子馅还没准备好,就不知道实际的饺子有多大。
可以用 view的post(Runnable r)方法解决,把一个线程放到消息队列,布局加载完,线程会在主线程执行,得到view的宽度和高度
- package com.manning.androidhacks.hack013;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private TextView mTextView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mTextView = (TextView) findViewById(R.id.my_text_view);
- mTextView.post(new Runnable() {
- @Override
- public void run() {
- String size = String.format("TextView's width: %d, height: %d", mTextView.getWidth(), mTextView.getHeight());
- Toast.makeText(MainActivity.this, size, Toast.LENGTH_SHORT).show();
- }
- });
- }
- }
原文:
提示:view源码中有很多post()的用法,可以查找post,看看其用法,理解了就不会滥用