Android中获取View宽高的最佳方法

移动开发 Android
使用​ViewTreeObserver​和​OnGlobalLayoutListener」这是获取控件最终宽高的可靠方法。可以通过给控件添加一个ViewTreeObserver并注册一个OnGlobalLayoutListener来监听控件的全局布局变化。

在Android中,获取View的宽高通常有多种方法,Android的视图布局和测量是异步进行的,在某些生命周期阶段,控件的宽高可能还未确定。以下是获取控件宽高的几种常用方法:

  • 「重写onMeasure方法」如果是自定义View类,可以在onMeasure方法中获取到控件的宽高。注意onMeasure方法是在测量阶段调用的,此时控件的宽高值可能已经通过父控件的布局参数设置或measureSpec确定。
  • 「使用getMeasuredWidth()和getMeasuredHeight()」这两个方法返回的是控件在测量阶段确定的宽高值。如果控件尚未经过测量(例如,在onCreate方法中直接调用),返回的值可能是0。
  • 「使用getWidth()和getHeight()」这两个方法返回的是控件在布局阶段确定的最终宽高值。如果在布局阶段之前(例如在onCreate方法中)调用,也可能返回0。
  • 「使用ViewTreeObserver和OnGlobalLayoutListener」这是获取控件最终宽高的可靠方法。可以通过给控件添加一个ViewTreeObserver并注册一个OnGlobalLayoutListener来监听控件的全局布局变化。当控件的布局完成后,OnGlobalLayoutListener的onGlobalLayout方法会被调用,此时可以安全地获取控件的宽高。

示例代码:

View view = findViewById(R.id.view);
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int width = view.getWidth();
        int height = view.getHeight(); 
    }
});
  1. 「使用post方法」post方法将一个Runnable对象排队到主线程的执行队列中,在控件的绘制阶段之后执行。通常用于在控件的布局和绘制完成后执行某些操作,可以通过post方法来延迟获取控件的宽高。

示例代码:

View view = findViewById(R.id.view);
view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
        int height = view.getHeight();
    }
});
  • 「使用View.LayoutParams」在某些情况下,可以通过检查控件的LayoutParams来预测其可能的宽高。通常只适用于那些使用固定尺寸(如WRAP_CONTENT或MATCH_PARENT)或具体尺寸(如dp或px值)的控件。此方式不能保证获取到的是控件的最终宽高。
  • 「使用onWindowFocusChanged」方法会被调用多次,在View初始化完毕后会调用,当Activity的窗口得到焦点和失去焦点都会被调用一次(例如在Activity onResume时)。

示例代码:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);
  if (hasFocus) {
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
  }
}

在尝试获取控件的宽高时,应该考虑控件的生命周期和布局流程,确保在正确的时机获取到正确的值。

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2017-04-28 09:58:21

AndroidLinearLayou宽高

2021-09-26 08:35:17

Android控件宽高

2011-12-27 10:18:31

Web

2024-08-27 11:12:31

2011-10-19 16:21:45

2017-08-21 21:36:23

AndroidViewJava

2014-08-19 10:06:53

IAP

2017-12-28 14:51:01

AndroidView焦点

2012-03-26 10:45:00

虚拟化VMware View数字证书

2016-12-12 09:58:47

AndroidAndroid Vie

2011-09-01 14:36:38

敏捷

2012-04-11 10:21:54

WEB网站

2009-09-08 16:22:27

c# listBox

2009-06-17 14:36:10

SpringXML配置文件

2013-01-08 13:46:58

Android开发ViewStub布局

2013-06-25 11:06:07

Android开发颜色定义方法

2011-06-02 09:51:05

Android 手机

2009-06-17 14:17:04

SpringXML配置文件

2012-05-18 10:52:20

TitaniumAndroid模块自定义View模块

2022-06-28 13:25:19

K8sPrometheusGrafana
点赞
收藏

51CTO技术栈公众号