在自定义ViewGroup内部的init中调用AddView是否安全?

问题描述

我已经测试了以下内容:

class Test(context: Context): ViewGroup(context) {

    var textBox = Text(context)

    init {
        textBox.text = "HELLOWORLD"
        textBox.textSize = 30f
        textBox.setBackgroundColor(Color.RED)
        addView(textBox)
        setBackgroundColor(-10000)
    }

    override fun onMeasure(widthMeasureSpec: Int,heightMeasureSpec: Int) {

        children.forEach {
            it.measure(MeasureSpec.makeMeasureSpec(100,MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(100,MeasureSpec.UNSPECIFIED))
        }

        setMeasuredDimension(
            MeasureSpec.getSize(widthMeasureSpec),MeasureSpec.getSize(heightMeasureSpec)
        )
    }

    override fun onLayout(p0: Boolean,p1: Int,p2: Int,p3: Int,p4: Int) {
        children.forEach {
            it.layout(50,50,600,600)
        }

        println("LAYOUT HAPPENED HERE")
    }
}

Text类如下:

class Text(context: Context): AppCompatTextView(context) {

    override fun onLayout(changed: Boolean,left: Int,top: Int,right: Int,bottom: Int) {
        super.onLayout(changed,left,top,right,bottom)
        println("TEXT ON LAYOUT HAPPENED")
    }
}

并在MainActivity中进行了尝试:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val test = Test(applicationContext)
        test.layoutParams = ViewGroup.LayoutParams(500,500)
        myLayout.addView(test)

        test.addView(AppCompatTextView(applicationContext))
        test.addView(AppCompatTextView(applicationContext))
        test.addView(AppCompatTextView(applicationContext))
        test.addView(AppCompatTextView(applicationContext))
        test.addView(AppCompatTextView(applicationContext))

        button.setOnClickListener() {
            test.addView(AppCompatTextView(applicationContext))

            myLayout.requestLayout()
        }

    }
}

我已经体验到addView()不一定会触发布局过程。尽管有多次addView调用,但测试打印仅发生了一次,然后按下每个按钮便触发了布局过程。当我尝试更深入地研究ViewGroup源代码时,似乎正在使用标志并将ViewGroup标记为下一个布局过程的“脏”,这在onCreate()中不会发生。

我应该避免在init {}块中使用addView并使用,例如,attachViewToParent,或者当我像这样使用它时addview是安全的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...