Кнопки в RelativeLayout исчезают после изменения LayoutParams - PullRequest
2 голосов
/ 04 августа 2020

У меня пять кнопок в относительном макете, если я попытаюсь изменить их высоту динамически, некоторые кнопки исчезнут.

Как выглядят кнопки до нажатия

Кнопки после нажатия

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)

    }

Все, что я хочу сделать, - это изменить всю высоту кнопки случайным образом одним нажатием кнопки.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Я подозреваю, что вы теряете атрибуты относительного позиционирования при создании новых 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 }
}

Это использует функцию расширения updateLayoutParams , которая является частью библиотеки Core KTX. Он сохранит все, что касается LayoutParams, но также позволит вам изменить ширину.

Если вы не можете использовать Core KTX, вы можете быть немного более подробным. Замените каждый из этих вызовов примерно таким:

val params1 = btn_1.layoutParams
params1.width = w
btn_1.layoutParams = params1
1 голос
/ 04 августа 2020

Если вы хотите изменить только 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
}
...