为什么在 Kotlin 中异步设置视图尺寸不起作用?

Rad*_*por 4 android kotlin

这有效

myView.layoutParams = myView.layoutParams.apply { height = 100 }
Run Code Online (Sandbox Code Playgroud)

但这都不是(使用android-ktx)

myView.doOnLayout {
    myView.layoutParams = myView.layoutParams.apply { height = 100 }
}
Run Code Online (Sandbox Code Playgroud)

也不是这个

myView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        myView.layoutParams = myView.layoutParams.apply { height = 100 }
        myView.viewTreeObserver.removeOnGlobalLayoutListener(this)
    }
})
Run Code Online (Sandbox Code Playgroud)

甚至这个

postDelayed({
    myView.layoutParams = myView.layoutParams.apply { height = 100 }
}, 100)
Run Code Online (Sandbox Code Playgroud)

作品。为什么?

hlu*_*kyi 5

更改 的高度或宽度LayoutParams不会影响其视图。LayoutParams是简单的价值持有者。要应用更改,您必须调用requestLayout

myView.doOnLayout { 
    myView.layoutParams.height = 100
    myView.requestLayout() 
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是重新分配layoutParams

myView.doOnLayout {
    myView.layoutParams = myView.layoutParams.apply {
        height = 100
    }
}
Run Code Online (Sandbox Code Playgroud)

你的第一个例子可能是因为分配是在绘制视图之前执行的。