安卓动态添加View时父控件宽高为0的解决方法(activity中onCreate调用)

背景

希望给相对布局中的所有子控件增加一个统一的遮罩层.

问题

增加遮罩层,就涉及到addView时需要指定增加的这个view的宽高.但是如果在activity的onCreate方法就调用动态 添加方法的话,会导致添加失败.因为此时视图还未绘制出来,父控件的宽高为0.

解决方法

调用父控件viewTreeObserver的addOnPreDrawListener方法,在这个方法里进行动态添加.
代码样例:

/**
 * 动态添加遮罩层view。
 * 通过调用viewTreeObserver的addOnPreDrawListener方法,可以在视图绘制前进行添加。
 * 因为此时视图已经经过了onMeasure,知道了自己的宽高。
 */
private fun addView(viewGroup: ViewGroup, maskView: View?) {
    viewGroup.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
        override fun onPreDraw(): Boolean {
            viewGroup.viewTreeObserver.removeOnPreDrawListener(this)
            viewGroup.addView(maskView, viewGroup.width, viewGroup.height)
            return true
        }
    })
}

参考完整源代码

https://gitee.com/cxyzy1/maskLayer

你可能感兴趣的:(安卓动态添加View时父控件宽高为0的解决方法(activity中onCreate调用))