«wrap_content» не работает должным образом в MotionLayout при установке нового значения.Я создал образец с TextView выше RecyclerView.Сначала TextView был установлен на android:layout_height="wrap_content"
и android:text='Hello World!
.Затем TextView#setText()
будет вызываться после извлечения контента с сервера.Поэтому мой вопрос в том, что высота TextView не изменится после того, как я установлю очень длинный текст.
Я использую implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha4
.Вот пример кода:
MainActivity.kt:
package com.paranoid.mao.motionlayoutwrapcontentexp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
private val dummyItems = List(100) { "Item: $it" }
private val longText = "Wrap content \nnot works!"
private lateinit var header: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
header = findViewById(R.id.header)
val recyclerView = findViewById<RecyclerView>(R.id.recycler)
recyclerView.adapter = MyAdapter()
// set immediately will work fine
// header.text = longText
// set with some delay won't show properly
simulateLoadFromRemote()
}
private fun simulateLoadFromRemote() {
thread {
TimeUnit.SECONDS.sleep(1)
runOnUiThread {
header.text = longText
}
}
}
...
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout
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"
app:layoutDescription="@xml/scene_activity_main"
tools:motionProgress="0"
tools:context=".MainActivity">
<TextView
android:id="@+id/header"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingTop="48dp"
android:text="Hello World!"
android:textSize="48sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="0dp"
android:layout_height="0dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toBottomOf="@id/header"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.motion.widget.MotionLayout>
scene_activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetStart="@id/start"
motion:constraintSetEnd="@id/end">
<OnSwipe
motion:dragDirection="dragUp"
motion:touchAnchorId="@id/recycler"
motion:touchAnchorSide="top"/>
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@id/header"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:scaleX="1"
android:scaleY="1"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintTop_toTopOf="parent">
</Constraint>
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@id/header"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:scaleX="0.5"
android:scaleY="0.5"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintBottom_toTopOf="parent">
</Constraint>
</ConstraintSet>
</MotionScene>
Ожидается: https://ibb.co/zR7Pq8V
Фактически: https://ibb.co/QdLkJQX
Обновление : implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3
не имеет этой проблемы.