Как заставить двустороннюю связь читать текст и переключаться вместе в Android?

Здравствуйте, я пытаюсь заставить двустороннюю связь считывать текст из 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 },
                    )
                }
            }

По какой-то причине считывается только текст, а строка переключателя по умолчанию игнорируется. Моя цель - сделать так, чтобы оно читалось как «Показать мое имя. Дважды нажмите переключатель Вкл./Выкл. для переключения». За один присест. Как я могу этого добиться?

0
0
281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации:

При реализации элементов управления выбором, таких как 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).

Другие вопросы по теме