美文网首页
安卓动态添加View时父控件宽高为0的解决方法(activity

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

作者: 蓝不蓝编程 | 来源:发表于2020-09-21 09:07 被阅读0次

    背景

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

    问题

    增加遮罩层,就涉及到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

          本文链接:https://www.haomeiwen.com/subject/nlwzsktx.html