有时我们需要获取View
的宽高,但是即使我们在onResume
中获取,有时候也是不准确的。那么到底该如何获取View
准确的宽高呢?
目录
1. 通过onWindowFocusChanged
方法
Activity
的窗口得到焦点时,View
已经初始化完成,此时获取到的View
的宽高是准确的
public class GetHeightSampleActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_height);
textView = findViewById(R.id.tv);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
Log.w("tv_width", "" + textView.getWidth());
Log.w("tv_height", "" + textView.getHeight());
}
}
}
2. 通过View.post()
来实现
通过post
可以将一个Runnable
放置到消息队列中,等到Looper
调用此Runnable
时,View
已经初始化完成
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_height);
textView = findViewById(R.id.tv);
textView.post(new Runnable() {
@Override
public void run() {
Log.w("tv_width", "" + textView.getWidth());
Log.w("tv_height", "" + textView.getHeight());
}
});
}
3. 通过ViewTreeObserver
的OnGlobalLayoutListener
回调
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_height);
textView = findViewById(R.id.tv);
final ViewTreeObserver viewTreeObserver = textView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
viewTreeObserver.removeOnGlobalLayoutListener(this);
Log.w("tv_width", "" + textView.getWidth());
Log.w("tv_height", "" + textView.getHeight());
}
});
}
推荐视频教程:
广告:
我使用的装备:程序员必备 | 不伤关节 | 手感好 | 静电容 | Plum键盘|Niz键盘 戳我