一、前言:
实际上在 onCreate、onStart、onResume中均无法正确得到某个 View 的宽/高信息,这是因为 View 的 measure 过程和 Activity 的生命周期方法不是同步执行的,因此无法保证 Activity 执行了onCreate、onStart、onResume时某个 View 已经测量完毕。如果没有测量完毕,那么获得的宽/高就是 0。
当我们动态创建某些View时,需要通过获取他们的width和height来确定别的View的布局,但是在onCreate()获取view的width和height会得到0。View.getWidth()和View.getHeight()为0的根本原因是控件还没有完成绘制,你必须等待系统将绘制完View时才能获得。
二、解决方案:
1. Activity/View#onWindowFocusChanged
onWindowFocusChanged这个方法的含义是:View 已经初始化完毕,宽/高已经准备好了,这个时候去获取宽/高时没问题的。需要注意的是,onWindowFocusChanged会被调用多次,当 Activity 的窗口得到焦点和失去焦点时,均会被调用一次。如果频繁地进行 onResume 和 onPause,那么onWindowFocusChanged也会频繁地调用。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus){
int width = btn_weak.getMeasuredWidth();