方法一(推荐)
getViewTreeObserver()
flMenuTop.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
...
//移除监听。
//OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。
flMenuTop.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
kotlin中的写法
获取到宽高后,将监听移除
iv_floating_right.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (originX == 0) {
originX = iv_floating_right.x.toInt()
} else {
iv_floating_right.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
LogUtils.d("originX=" + originX)
}
})
方法二,使用handler延时获取
weakHandler.postDelayed(new Runnable() {
@Override
public void run() {
...
}
}, 500);
方法三,在onWindowFocusChanged中获取(推荐)
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
//页面每次被遮挡、重新显示,都会回调该方法。
//BottomSheetDialogFragment的启动也会触发onWindowFocusChanged
//BottomSheetDialogFragment的启动不会触发onPause、onResume
Log.d(TAG, "onWindowFocusChanged: ")
//延迟初始sdk,方法内做了判断,只会初始化一次
ApplicationLike.initSdk(applicationContext)
//此时可以获取到控件的宽高信息,因为此时xml已经绘制到屏幕上了
}
方法四(推荐)
- 通过view.post进行获取
binding.stickerLayout.post {
LogUtils.d("width=${binding.stickerLayout.width}")
}