如何解决在自定义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 举报,一经查实,本站将立刻删除。