总所周知,在activity启动的onCreate或者其余生命周期里去获取View的尺寸是错误的,由于颇有可能View并无初始化测量绘制完成.你这个时候获取的宽或的高不出意外就是0.因此,咱们须要等待View的绘制完成后再来测量java
mTextView.post(new Runnable() { @Override public void run() { int w = mTextView.getWidth(); int h = mTextView.getHeight(); } });
这个方式在TextView初始化所有完成后会执行这个消息列队里的逻辑ide
mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mHeaderViewHeight = mHeaderView.getHeight(); mHeaderView.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } });
可是须要注意的是OnGlobalLayoutListener可能会被屡次触发,所以在获得了高度以后,要将OnGlobalLayoutListener注销掉。另外mHeaderViewHeight和mHeaderView都须要写在当前java文件类(好比Activity)的成员变量中。post
或者:this
public class TestActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener { private TextView tips; private ImageView mTestImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); tips = findViewById(R.id.tips); tips.getViewTreeObserver().addOnGlobalLayoutListener(this); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void onGlobalLayout() { mTestImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }