问题描述
我已经测试了以下内容:
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 (将#修改为@)