简述在Activity启动的时候获得View宽高的方式 ?

参考回答

Activity 启动时,如果想要获取 View 的宽高,可以使用 ViewTreeObserver 来监听布局的变化。常见的方法是通过 View.getViewTreeObserver().addOnPreDrawListener()View.post() 来在布局完成后获取宽高。

view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
        view.getViewTreeObserver().removeOnPreDrawListener(this);
        int width = view.getWidth();
        int height = view.getHeight();
        // 使用宽高
        return true;
    }
});
Java

详细讲解与拓展

  1. 为什么不能直接在 onCreate 中获取宽高?
    ActivityonCreateonStart 方法中,View 可能还没有完全布局,因此无法直接获取其宽高。Android 的布局是异步的,View 的宽高是在视图树被完全测量和布局后才确定的。因此,需要等待布局完成后再去获取宽高。

  2. ViewTreeObserver 的作用
    ViewTreeObserver 是一个与视图树的变化相关的观察者,它可以监听视图树的不同阶段(例如布局、绘制等)。使用 addOnPreDrawListener 方法可以在视图即将绘制前获取到视图的宽高。

  3. post() 方法
    另一种常见的方式是使用 View.post() 方法,这个方法会将传入的代码延迟到下一次 View 的绘制周期中执行。因此,View.post() 可以确保在视图完成布局之后再执行,获取到正确的宽高。

view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
        int height = view.getHeight();
        // 使用宽高
    }
});
Java
  1. 举个例子
    比如我们在 ActivityonCreate 方法中想要获取某个 TextView 的宽高来调整布局,可以使用上面提到的方法。如果直接在 onCreate 中获取,宽高可能为 0,因此可以使用 post()ViewTreeObserver 来保证获取的宽高是正确的。

    例如,在一个复杂的布局中,你可能想要知道一个按钮的宽度来决定是否显示一个特定的内容。这时,可以使用 post() 方法来确保按钮已经正确布局,然后再获取宽高。

总结

获取 View 的宽高需要在布局完成之后,通常可以通过 ViewTreeObserverView.post() 方法来实现。这两种方式可以保证你在正确的时机获取到视图的准确宽高。

发表评论

后才能评论