Пользовательский компонент не получает фокус при щелчке с помощью кликабельного модификатораAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Пользовательский компонент не получает фокус при щелчке с помощью кликабельного модификатора

Сообщение Anonymous »

У меня возникли проблемы с тем, чтобы сделать пользовательский компонент одновременно фокусируемым и кликабельным. Моя цель — создать собственный компонент, который автоматически получает фокус при нажатии. Для этого я следую официальной документации Google по focusRequester. Я использую composeBom="2025.05.00"
Однако я столкнулся со следующими проблемами:
Пример 1:
Я понял, что кликабельный модификатор внутренне создает фокусируемый узел, поэтому мой первый подход был:

Код: Выделить всё

@Composable
fun Sample1() {

val focusRequester = remember { FocusRequester() }
val interactionSource = remember { MutableInteractionSource() }
val isFocused = interactionSource.collectIsFocusedAsState().value
val color by  remember(isFocused) { mutableStateOf(if (isFocused) Blue else Green) }

Column {
Box(
Modifier
.background(color)
.focusRequester(focusRequester)
.clickable(
interactionSource = interactionSource,
indication = null,
onClick = { focusRequester.requestFocus() }
)
) {
Text("Focusable box")
}
}
}
К сожалению, когда я щелкаю компонент, он не получает фокус, хотя он получает фокус при навигации с помощью клавиатуры (клавиша Tab).
Пример 2:
Во второй попытке я вручную добавил фокусируемый узел, и теперь он получает фокус при щелчке. Однако появилась новая проблема: «двойной фокус» при навигации с помощью клавиши Tab, что имеет смысл, поскольку присутствуют и мой узел, и узел из кликабельного.

Код: Выделить всё

@Composable
fun Sample2() {

val focusRequester = remember { FocusRequester() }
val interactionSource = remember { MutableInteractionSource() }
val isFocused = interactionSource.collectIsFocusedAsState().value
val color by  remember(isFocused) { mutableStateOf(if (isFocused) Blue else Green) }

Column {
Box(
Modifier
.background(color)
.focusRequester(focusRequester)
.focusable(interactionSource = interactionSource)
.clickable(
interactionSource = interactionSource,
indication = null,
onClick = { focusRequester.requestFocus() }
)
) {
Text("Focusable box")
}
}
}
Я не уверен, следует ли мне сообщать об этом как об ошибке или мне что-то не хватает в моей реализации. Кто-нибудь может мне помочь?
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/796 ... e-modifier
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»