更改 LayoutParams 后 RelativeLayout 中的按钮消失

Buttons in a RelativeLayout disappear after changing LayoutParams

我在相对布局中有五个按钮,如果我尝试动态更改它们的高度,一些按钮就会消失。

How buttons are looking before clicking

Buttons after clicking

val w = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45f, resources.displayMetrics)
    btn_ran.setOnClickListener {
        btn_1.layoutParams = RelativeLayout.LayoutParams(w.toInt(), 700)
        btn_3.layoutParams = RelativeLayout.LayoutParams(w.toInt(), 700)
        btn_4.layoutParams = RelativeLayout.LayoutParams(w.toInt(), 700)
        btn_2.layoutParams = RelativeLayout.LayoutParams(w.toInt(), 700)
        btn_5.layoutParams = RelativeLayout.LayoutParams(w.toInt(), 700)

    }

我只想在点击按钮时随机更改所有按钮的高度。

如果你只想把height改成随机值你可以这样做:

button1.setOnClickListener {
    val h = (100..500).random() //random integer between 100 and 500
    button1.layoutParams.height = h
    button2.layoutParams.height = h
    button1.requestLayout() //refresh layout
}

我怀疑您在创建新的 LayoutParams 对象时丢失了 相对定位 属性。请记住,像 layout_toEndOf 这样的属性是布局参数的一部分。

试试这个:

val w = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45f, resources.displayMetrics)
btn_ran.setOnClickListener {
    btn_1.updateLayoutParams { this.width = w }
    btn_3.updateLayoutParams { this.width = w }
    btn_4.updateLayoutParams { this.width = w }
    btn_2.updateLayoutParams { this.width = w }
    btn_5.updateLayoutParams { this.width = w }
}

这利用了作为 Core KTX 库一部分的 the updateLayoutParams extension function。它将使 LayoutParams 的所有内容保持不变,但也允许您修改宽度。

如果你不会用Core KTX,那你可以再啰嗦一点。用这样的东西替换每个调用:

val params1 = btn_1.layoutParams
params1.width = w
btn_1.layoutParams = params1