在View的宽高测量结果中,有时你会发现明明可以实现,但检测的宽高结果为0。所以这里介绍了四种方法来让View的检测宽高结果显示出来。
1.可能没有调用View.OnMeasure()方法。所以测量的结果为0。这里通过调用View.OnMeasure()得到测量的结果。
mText.measure(0,0); int widthMeasureSpec = mText.getMeasuredWidth(); Toast.makeText(MainActivity.this, "widthMeasureSpec=" + widthMeasureSpec, Toast.LENGTH_SHORT).show();
2.通过View.ViewTreeObserver()的方法,通过监听树的发生变化而实现了测量的结果。
mText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mText.getViewTreeObserver().dispatchOnPreDraw(); int height = mText.getHeight(); Toast.makeText(MainActivity.this, "height=" + height, Toast.LENGTH_SHORT).show(); }
3.通过实现View.onWindowFocusChanged()方法,通过获取到控件的焦点来实现了测量的结果。
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); int height = mText.getHeight(); Toast.makeText(MainActivity.this, "height=" + height, Toast.LENGTH_SHORT).show(); }
4.通过View.post()方法来实现,其实这个方法内部实现的Handle的消息队列MessageQueue和Message方法。所以当上面的控件或Activity创建和初始化完成后,才开始测量结果
mText.post(new Runnable() { @Override public void run() { int height = mText.getHeight(); Toast.makeText(MainActivity.this, "height=" + height, Toast.LENGTH_SHORT).show(); } });