有时我们需要获取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键盘 戳我

本文介绍了三种获取Android中View宽高的准确方法:通过onWindowFocusChanged方法、使用View.post()和利用ViewTreeObserver的OnGlobalLayoutListener回调。这三种方法都能确保在View完全布局后获取其尺寸。

607

被折叠的 条评论
为什么被折叠?



