установка новой высоты для дочернего представления RelativeLayout не применяется сразу - PullRequest
0 голосов
/ 03 июня 2019

ребята! У меня очень неприятная проблема. У меня есть активность и пользовательский макет (подкласс 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>

Исходное состояние

Результат после первого нажатия

Результат (разыскивается) после второго нажатия

...