Невозможно сфокусировать что-либо, кроме TextField
Я уже просматривал другие сообщения на сайте. Они предлагают использовать
focusRequestor
модификатор, и я пробовал это.
val scope = rememberCoroutineScope()
val focusRequester = remember { FocusRequester() }
Text(
modifier = Modifier
.focusable()
.focusTarget() //Tried Adding/Removing
.onFocusChanged {
if (it.hasFocus || it.isFocused) {
Log.i("Test", "Text Focused")
}
} // Tried Adding Visual Elements to delete it as well.
.focusRequester(focusRequester),
text = "MARSK"
)
LaunchedEffect(scope) {
focusRequester.requestFocus()
}
я говорю
Text
в этом примере, но на самом деле мне нужно реализовать это на
Canvas
. Этот подход не работает
Box
тоже. Боюсь, что то же самое и с другими контейнерами.
В качестве фона он создается для моего телевизора, поэтому я хочу сделать этот элемент доступным для нажатия кнопки OK на D-Pad пульта дистанционного управления. Мой подход состоит в том, чтобы сначала сделать его сфокусированным, а затем, если предположить, что после того, как он сфокусирован, он автоматически обнаружит нажатие кнопки OK как «щелчок». Если с моим подходом что-то не так, также приветствуются отзывы об улучшениях.
PS: Решение Abhimanyu работает как шарм на мобильных устройствах. Однако, поскольку я упомянул телевизор выше, рассматриваемое устройство - это телевизор. На телевизоре мне нужно нажать кнопку (работает любая кнопка на DPAD, даже кнопка OK, как ни странно), чтобы сфокусировать его. Есть идеи, как обойти эту проблему?
Спасибо
1 ответ
Проблема
Следует добавить ПЕРЕД наблюдаемым или .
Изменения
- Удалить и переместить
onFocusChanged
до . - Также обратите внимание, что
focusRequester
должно быть раньше.
Мы надеемся, что это сработает для всех составных объектов. Я тестировал использование, и пример из Документов использовал
Box
.
Дополнительные детали .
Предпочитать
focusable
над .Из
focusTarget
документы,
Примечание: это модификатор низкого уровня. Прежде чем использовать это, рассмотрите возможность использования Modifier.focusable(). Он использует focusTarget в своей реализации. Modifier.focusable() добавляет семантику, необходимую для доступности.
- Порядок модификаторов имеет значение
Макеты в Jetpack Compose Codelab
CheckOrder Matters
раздел
порядок имеет значение при цепочке модификаторов, поскольку они применяются к составному объекту, который они изменяют от более раннего к более позднему,
Образец кода
@Composable
fun FocusableText() {
val scope = rememberCoroutineScope()
val focusRequester = remember { FocusRequester() }
var color by remember { mutableStateOf(White) }
LaunchedEffect(scope) {
focusRequester.requestFocus()
}
Text(
modifier = Modifier
.background(color)
.onFocusChanged {
color = if (it.hasFocus || it.isFocused) {
LightGray
} else {
White
}
}
.focusRequester(focusRequester)
.focusable(),
text = "Test Text"
)
}
The
Text
фон
LightGray
что указывает на то, что текст находится в фокусе.