總所周知,在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); } }