在Android开发中,获取控件的宽高是常见的需求,由于Activity的启动流程和布局文件的加载流程是异步进行的,在onCreate()或onResume()方法中直接使用getWidth()和getHeight()方法获取控件的宽高通常会得到0,开发者需要采用其他方法来确保能够正确获取控件的宽高,以下是几种常用的方法:
1、重写onWindowFocusChanged()方法
描述:重写onWindowFocusChanged()方法,当Activity的窗口焦点发生变化时调用该方法。
实现步骤:
a. 在onWindowFocusChanged()方法中添加判断,如果当前页面有焦点(hasFocus为true),则获取控件的宽高。
b. 示例代码如下:
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { getTextWidthHeight(); } }
c. 需要注意的是,这个方法可能会执行多次,比如锁屏、切到后台等重新进入时都会执行该方法。
2、添加OnPreDrawListener事件监听
描述:通过给控件添加OnPreDrawListener事件监听器,在控件绘制前获取宽高。
实现步骤:
a. 获取DecorView的ViewTreeObserver对象。
b. 添加OnPreDrawListener监听器。
c. 在onPreDraw()方法中获取控件的宽高,并移除监听器。
d. 示例代码如下:
getWindow().getDecorView().getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getTextWidthHeight(); getWindow().getDecorView().getViewTreeObserver().removeOnPreDrawListener(this); return false; } });
3、添加OnGlobalLayoutListener事件监听
描述:通过给控件添加OnGlobalLayoutListener事件监听器,在控件全局布局完成后获取宽高。
实现步骤:
a. 获取DecorView的ViewTreeObserver对象。
b. 添加OnGlobalLayoutListener监听器。
c. 在onGlobalLayout()方法中获取控件的宽高,并移除监听器。
d. 示例代码如下:
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { getTextWidthHeight(); getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
4、post Runnable方式
描述:使用post方法将一个Runnable对象排队到主线程的执行队列中,在控件的绘制阶段之后执行。
实现步骤:
a. 获取控件对象。
b. 调用控件的post方法,传入一个Runnable对象。
c. 在Runnable对象的run方法中获取控件的宽高。
d. 示例代码如下:
textView.post(new Runnable() { @Override public void run() { getTextWidthHeight(); } });
以下是上述四种方法的比较表格:
方法名称 | 描述 | 实现步骤 | 注意事项 |
重写onWindowFocusChanged()方法 | 重写onWindowFocusChanged()方法,当Activity的窗口焦点发生变化时调用该方法。 | 1. 在onWindowFocusChanged()方法中添加判断,如果当前页面有焦点(hasFocus为true),则获取控件的宽高。 | 这个方法可能会执行多次,比如锁屏、切到后台等重新进入时都会执行该方法。 |
添加OnPreDrawListener事件监听 | 通过给控件添加OnPreDrawListener事件监听器,在控件绘制前获取宽高。 | 1. 获取DecorView的ViewTreeObserver对象。 2. 添加OnPreDrawListener监听器。 3. 在onPreDraw()方法中获取控件的宽高,并移除监听器。 | |
添加OnGlobalLayoutListener事件监听 | 通过给控件添加OnGlobalLayoutListener事件监听器,在控件全局布局完成后获取宽高。 | 1. 获取DecorView的ViewTreeObserver对象。 2. 添加OnGlobalLayoutListener监听器。 3. 在onGlobalLayout()方法中获取控件的宽高,并移除监听器。 | |
post Runnable方式 | 使用post方法将一个Runnable对象排队到主线程的执行队列中,在控件的绘制阶段之后执行。 | 1. 获取控件对象。 2. 调用控件的post方法,传入一个Runnable对象。 3. 在Runnable对象的run方法中获取控件的宽高。 |
Android中获取控件宽高有多种方法,每种方法都有其适用的场景和注意事项,开发者可以根据具体的需求选择合适的方法来获取控件的宽高。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1259639.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复