Здравствуйте, я пытаюсь заставить двустороннюю связь считывать текст из Text() и строку по умолчанию из Switch(), используя семантику составления. Это мой код:
var toggle by remember {
mutableStateOf(true)
}
Column(
modifier = Modifier.fillMaxSize(),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.semantics(mergeDescendants = true) {
isTraversalGroup = true
},
) {
Text(
modifier = Modifier.semantics {
traversalIndex = 1f
},
text = "Show my name.",
)
Switch(
modifier = Modifier.semantics {
traversalIndex = 2f
},
checked = toggle,
onCheckedChange = { toggle = !toggle },
)
}
}
По какой-то причине считывается только текст, а строка переключателя по умолчанию игнорируется. Моя цель - сделать так, чтобы оно читалось как «Показать мое имя. Дважды нажмите переключатель Вкл./Выкл. для переключения». За один присест. Как я могу этого добиться?
Согласно документации:
При реализации элементов управления выбором, таких как Switch, RadioButton или Checkbox, вы обычно переносите интерактивное поведение в родительский контейнер, устанавливаете обратный вызов щелчка для составного объекта в значение null и добавляете переключаемый или выбираемый модификатор к родительскому составному элементу.
Таким образом, использование модификатора toggleable в строке в вашем случае будет выглядеть примерно так:
var toggle by remember {
mutableStateOf(true)
}
Column(
modifier = Modifier.fillMaxSize(),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.toggleable(
value = toggle,
role = Role.Switch,
onValueChange = { toggle = !toggle }
)
) {
Text(
text = "Show my name.",
modifier = Modifier
.weight(1f)
.align(Alignment.CenterVertically)
)
Switch(
checked = toggle,
onCheckedChange = null,
)
}
}
Я также попробовал это с основными функциями клавиатуры, и, похоже, это работает:
adb shell input keyevent KEYCODE_TAB # navigate
adb shell input keyevent KEYCODE_ENTER # toggle
Если вас беспокоит порядок объявления («Включить, [Текст], Переключить»), имейте в виду, что он может быть изменен пользовательскими настройками TalkBack и является результатом вычислений в программе чтения с экрана (TalkBack).