Невозможно сфокусировать что-либо, кроме 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 ответ

Проблема
Следует добавить ПЕРЕД наблюдаемым или .

Источник

Изменения

  1. Удалить и переместить onFocusChangedдо .
  2. Также обратите внимание, что focusRequesterдолжно быть раньше.

Мы надеемся, что это сработает для всех составных объектов. Я тестировал использование, и пример из Документов использовал Box.

Дополнительные детали .

  1. Предпочитать focusableнад .

    Из focusTargetдокументы,

Примечание: это модификатор низкого уровня. Прежде чем использовать это, рассмотрите возможность использования Modifier.focusable(). Он использует focusTarget в своей реализации. Modifier.focusable() добавляет семантику, необходимую для доступности.

  1. Порядок модификаторов имеет значение
    Макеты в Jetpack Compose Codelab
    Check Order 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что указывает на то, что текст находится в фокусе.

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