ребята! У меня очень неприятная проблема. У меня есть активность и пользовательский макет (подкласс RelativeLayout) на нем. Этот макет включает в себя один дочерний RelativeLayout. Ширина дочернего элемента равна половине ширины родительского элемента. Рост ребенка равен половине роста родителя. Также есть кнопка. Когда я нажимаю эту кнопку, я устанавливаю высоту родительского макета равной 1000 пикселей. В родительском макете я переопределил метод onSizeChanged, где я изменяю высоту дочернего представления, чтобы снова быть половиной родительского. Но это не работает в первый раз! Только когда я нажму кнопку второй раз, мои изменения будут применены. Не могли бы вы мне помочь, пожалуйста? Вот мой код:
class TempLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : RelativeLayout(context, attrs, defStyle) {
lateinit var child: RelativeLayout
init {
setBackgroundColor(Color.BLUE)
post {
child = RelativeLayout(context)
child.layoutParams = LayoutParams(width / 2, height / 2).apply {
addRule(CENTER_IN_PARENT)
}
child.setBackgroundColor(Color.RED)
addView(child)
}
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
if (oldh == 0 && oldw == 0) {
return
}
child.layoutParams.width = width / 2
child.layoutParams.height = height / 2
child.invalidate()
child.requestLayout()
invalidate()
requestLayout()
}
}
class TempActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_temp)
val btn = findViewById<Button>(R.id.button)
btn.setOnClickListener {
val layout = findViewById<TempLayout>(R.id.tempLayout)
layout.layoutParams.height = 1000
layout.invalidate()
layout.requestLayout()
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.TempActivity">
<TempLayout
android:id="@+id/tempLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintTop_toTopOf="parent">
</TempLayout>
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Исходное состояние
Результат после первого нажатия
Результат (разыскивается) после второго нажатия