XML ConstraintLayout中可滚动ComposeView:状态变更时滚动位置跳变
ConstraintLayout中ComposeView滚动位置跳变问题
在XML的ConstraintLayout里,我给ComposeView设置了与其他View的约束关系,ComposeView内部包含一个带VerticalScroll的Column组件。当滚动到Column底部后,切换开关这类状态时,滚动位置会突然跳变,导致Column底部被隐藏,跳变的距离等同于被约束View的高度。无论ComposeView约束到其他View的顶部还是底部,这个问题都会出现。我尝试使用rememberNestedScrollInteropConnection,但并未解决问题。
可复现代码
fragment_main.xml
<?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" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/hello" android:layout_width="match_parent" android:layout_height="120dp" android:background="#12978C" android:text="Hello World!" android:textAlignment="center" app:layout_constraintBottom_toTopOf="@+id/compose" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/hello" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainFragment.kt
class MainFragment: Fragment() { private lateinit var binding: FragmentMainBinding override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = FragmentMainBinding.inflate( inflater, container, false ).apply { binding = this }.root override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.compose.setContent { val state = remember { List(25) { false }.toMutableStateList() } Column( Modifier.verticalScroll(rememberScrollState()) ) { for (i in 0..24) { Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center) { Text(i.toString(), fontWeight = FontWeight.Bold) Spacer(Modifier.width(15.dp)) Switch(state[i], { state[i] = it }) } } } } } }
内容的提问来源于stack exchange,提问作者avatar_aang
相关产品推荐
相关产品推荐

