简述在Activity启动的时候获得View宽高的方式 ?
参考回答
在 Activity
启动时,如果想要获取 View
的宽高,可以使用 ViewTreeObserver
来监听布局的变化。常见的方法是通过 View.getViewTreeObserver().addOnPreDrawListener()
或 View.post()
来在布局完成后获取宽高。
详细讲解与拓展
- 为什么不能直接在
onCreate
中获取宽高?
在Activity
的onCreate
或onStart
方法中,View
可能还没有完全布局,因此无法直接获取其宽高。Android 的布局是异步的,View
的宽高是在视图树被完全测量和布局后才确定的。因此,需要等待布局完成后再去获取宽高。 -
ViewTreeObserver
的作用
ViewTreeObserver
是一个与视图树的变化相关的观察者,它可以监听视图树的不同阶段(例如布局、绘制等)。使用addOnPreDrawListener
方法可以在视图即将绘制前获取到视图的宽高。 -
post()
方法
另一种常见的方式是使用View.post()
方法,这个方法会将传入的代码延迟到下一次View
的绘制周期中执行。因此,View.post()
可以确保在视图完成布局之后再执行,获取到正确的宽高。
-
举个例子
比如我们在Activity
的onCreate
方法中想要获取某个TextView
的宽高来调整布局,可以使用上面提到的方法。如果直接在onCreate
中获取,宽高可能为 0,因此可以使用post()
或ViewTreeObserver
来保证获取的宽高是正确的。例如,在一个复杂的布局中,你可能想要知道一个按钮的宽度来决定是否显示一个特定的内容。这时,可以使用
post()
方法来确保按钮已经正确布局,然后再获取宽高。
总结
获取 View
的宽高需要在布局完成之后,通常可以通过 ViewTreeObserver
或 View.post()
方法来实现。这两种方式可以保证你在正确的时机获取到视图的准确宽高。