云主机测评网云主机测评网云主机测评网

云主机测评网
www.yunzhuji.net

Android中如何获取控件宽高的4种方法是什么?

Android中获取控件宽高的4种方法包括:直接使用getWidth()和getHeight()方法,但需在布局完成后调用;重写onWindowFocusChanged()方法,在焦点变化时获取;添加OnPreDrawListener或OnGlobalLayoutListener监听布局变化;以及通过post方法延迟到绘制阶段后获取。

在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中获取控件宽高有多种方法,每种方法都有其适用的场景和注意事项,开发者可以根据具体的需求选择合适的方法来获取控件的宽高。

打赏
版权声明:主机测评不销售、不代购、不提供任何支持,仅分享信息/测评(有时效性),自行辨别,请遵纪守法文明上网。
文章名称:《Android中如何获取控件宽高的4种方法是什么?》
文章链接:https://www.yunzhuji.net/wangzhanyunwei/135370.html

评论

  • 验证码