返回

获取 View 宽高的奥秘:View.post() 背后的故事

Android

用View.post()方法在Android中获取View的宽高

什么是View.post()方法?

在Android开发中,获取View的宽高是一个常见需求。但直接在onCreate()方法中获取View的宽高,往往会得到0。这是因为View在onCreate()方法中还没有被测量和布局。

View.post()方法可以实现获取View正确宽高的目的。post()方法将一个Runnable对象排入消息队列,等待主线程空闲时执行。在Runnable对象中,就可以获取View的宽高。

为什么View.post()方法能获取到View的宽高?

要理解View.post()方法为什么能获取到View的宽高,需要先了解View的测量和布局过程。

测量

在测量阶段,View会计算自己的理想大小。理想大小是View在不考虑父View的限制条件下,希望拥有的尺寸。

布局

在布局阶段,View会根据父View的限制条件,计算自己的最终大小和位置。

View.post()方法是在测量和布局阶段之后调用的。此时,View已经有了自己的最终大小和位置,因此可以正确地获取View的宽高。

View.post()方法的用法

View.post()方法的用法非常简单。只需要将一个Runnable对象作为参数传递给post()方法即可。在Runnable对象中,就可以获取View的宽高。

View view = findViewById(R.id.my_view);
view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
        int height = view.getHeight();
    }
});

View.post()方法的优势

View.post()方法有以下优势:

  • 可以确保在View被测量和布局之后获取View的宽高。
  • 不需要在onCreate()方法中获取View的宽高,避免了NullPointerException异常。
  • 可以多次调用View.post()方法,以获取View在不同时刻的宽高。

使用示例

让我们看一个获取View宽高的实际示例:

Button button = findViewById(R.id.my_button);
button.post(new Runnable() {
    @Override
    public void run() {
        int width = button.getWidth();
        int height = button.getHeight();
        // 在这里使用width和height
    }
});

在上面的示例中,我们获取了按钮的宽高,然后在Runnable对象中使用它们。

结论

View.post()方法是一个非常有用的方法,可以帮助开发者获取View的正确宽高。在Android开发中,经常会用到View.post()方法。

常见问题解答

1. View.post()方法什么时候调用?

View.post()方法在View被测量和布局之后调用。

2. View.post()方法可以在任何线程中调用吗?

不,View.post()方法只能在主线程中调用。

3. View.post()方法可以多次调用吗?

是的,View.post()方法可以多次调用,以获取View在不同时刻的宽高。

4. View.post()方法会阻塞主线程吗?

不,View.post()方法不会阻塞主线程。它将Runnable对象排入消息队列,等待主线程空闲时执行。

5. 如何在View.post()方法中获取View的父View?

可以使用getParent()方法获取View的父View。