You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:31:16