我想要一个类似于XML的画外音:
- 首先显示文本
- 则开关状态
预期结果是"Sometext on switch"或"Sometext off switch">
在Jetpack Compose中,它显示"Off sometext Off switch";如果你双击它(使用对讲来改变状态),然后再次点击或滑动(到下一个和返回),它会显示"On sometext off switch"。
而且,双击并将状态更改为开/关(如XML)后没有声音。
var isChecked by remember { mutableStateOf(false) }
val toggleModifier =
Modifier.toggleable(
value = isChecked,
onValueChange = { isChecked = it },
role = Role.Switch
)
Box(modifier = Modifier.fillMaxSize()) {
val rowModifier = toggleModifier
.padding(16.dp)
.align(Alignment.Center)
Row(modifier = rowModifier) {
Text(text = "Sometext")
Switch(checked = isChecked, onCheckedChange = null)
}
}
第二个想法是将文本和开关与mergeDescendants结合起来,但它们是分开选择的:
var isChecked by remember { mutableStateOf(false) }
val toggleModifier =
Modifier.semantics(mergeDescendants = true) {}
Box(modifier = Modifier.fillMaxSize()) {
val rowModifier = toggleModifier
.padding(16.dp)
.align(Alignment.Center)
Row(modifier = rowModifier) {
Text(text = "Sometext")
Switch(checked = isChecked, onCheckedChange = { isChecked = !isChecked })
}
}
正如Utkarsh Tiwari在评论中提到的,这是一个组合错误,尚未修复。他们建议暂时使用Role.Checkbox
代替,它的工作原理与预期一样。或者根本不使用role
顺便说一句,用Modifier.then(rowModifier)
比只用modifier = rowModifier
好。最后应该是
Row(modifier = Modifier
.semantics(mergeDescendants = true) {}
.then(rowModifier)