Как запросить фокус на Text в Compose (для accessibility)?
У меня есть поле, где пользователь должен ввести пароль, и в случае неправильного ввода появляется текстовое поле под полем для пароля, на котором написано "Неверный пароль".
Мне нужно настроить accessibility (для слепых людей), которая будет вслух читать текстовое поле, где написано "Неверный пароль". Для этого (насколько я понимаю), мне нужно запросить фокус на этот текст ошибки, когда она появляется.
Вот мой код:
...
@Composable
private fun OTPBlock(
isErrorState: StateFlow<Boolean>
) {
val isError: Boolean by isErrorState.collectAsStateWithLifecycle()
...
if (isError) {
ErrorOtpViewMsg(isErrorState = isErrorState)
}
...
}
@Composable
private fun ErrorOtpViewMsg(isErrorState: StateFlow<Boolean>) {
val isError: Boolean by isErrorState.collectAsStateWithLifecycle()
val focusRequester = remember { FocusRequester() }
LaunchedEffect(isError) {
if (isError) {
focusRequester.requestFocus()
}
}
BounceAnimatedVisibility(isVisible = isError) {
Row(
modifier = Modifier.focusRequester(focusRequester),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Icon(
modifier = Modifier.size(20.dp),
painter = painterResource(id = R.drawable.ic_exclamation),
contentDescription = null
)
Text(
text = stringResource(...),
textAlign = TextAlign.Start,
color = ...
)
}
}
}
...
Идея в том, что после вызова этой функции ErrorOtpViewMsg LaunchedEffect запускает focusRequester.requestFocus, и фокус перемещается на Row с текстом, который должен быть прочитан вслух (в режиме accessibility).
В дебаге я вижу, что все работает как нужно, но текст все равно не читается.
Что не так?
Ответы (1 шт):
В итоге я решил это вот так:
Modifier...
.semantics {
...
liveRegion = LiveRegionMode.Assertive
}
Офф: https://developer.android.com/reference/kotlin/androidx/compose/ui/semantics/LiveRegionMode