问题
在 Activity 启动后就获取这个View 的宽/高
因为View的measure过程和Activity 的生命周期方法不是同步执行的,无法保证在 onCreate、onStart、onResume 时,某个 View 已经被测量完毕。
解决办法
1、onWindowFocusChanged(hasFocus: Boolean)
View已经初始化完毕,当 activity 的窗口得到焦点或者失去焦点时被调用(即当 activity 继续执行或者暂停执行时均会被调用)
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if(hasFocus){
var width = view.measuredWidth
var height = view.measuredHeight
}
}
2、view.post(runnable)
通过post将runnable投递到消息队列的尾部,等待Looper调用此runnable,View已经初始化好了
override fun onStart() {
super.onStart()
view.post {
var width = view.measuredWidth
var height = view.measuredHeight
}
}
3、 ViewTreeObserver
当 View 树的状态发生改变或 View 树内部的 View 的可见性发生改变时,onGlobal方法会被回调
override fun onStart() {
super.onStart()
var observer:ViewTreeObserver = view.viewTreeObserver
observer.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
view.viewTreeObserver.removeOnGlobalLayoutListener(this)
var width = view.measuredWidth
var height = view.measuredHeight
}
})
}
4、 view.measure(widthMeasureSpec:Int,heightMeasureSpec:Int)
通过手动对View进行measure获取宽/高