Принудительное присутствие программной клавиатуры в ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Принудительное присутствие программной клавиатуры в Compose

Сообщение Anonymous »

Я создаю экран поиска в приложении POS и хочу, чтобы программная клавиатура всегда отображалась, пока присутствует TextField. В идеале я хочу перехватить событие, когда пользователь скрывает клавиатуру, чтобы скрыть виджет поиска вместе с клавиатурой.
В настоящее время у меня есть

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

@Composable
fun Search(onHide: () -> Unit) {
var query by rememberSaveable { mutableStateOf("") }
BackHandler {
onHide() //works only when keyboard is already hidden
}
Column(modifier = Modifier.fillMaxHeight()) {
TextField(value = query, onValueChange = { query = it },
modifier = Modifier.focusRequester(focusRequester))
myItemsList.filter { it.title.startsWith(query) }.take(7).forEach {
SearchLine(it)
}
}
LaunchedEffect(key1 = focusRequester) {
focusRequester.requestFocus()
focusRequester.captureFocus()
//        keyboardController.show() //it is shown due to focus anyway
}
}
Для контекста я использую это следующим образом:

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

fun Content() {
var searchMode by rememberSaveable { mutableStateOf(true) } //FIXME false
AppTheme {
Surface {
if (searchMode) {
Search(onHide = { searchMode = false })
} else {
/* normally available activtiy contents */
}
}
}
}
Бонусные вопросы:
  • показать/скрыть клавиатуру без анимации
  • удалить верхняя панель GBoard (действия, стикеры, буфер обмена, голосовой ввод). KeyboardType.Password выполняет работу для GBoard на моем устройстве, но в целом это не совсем правильно.
Это, вероятно, актуально, потому что если это тоже так невозможно. Лучше всего использовать специальную клавиатуру в приложении? Я бы не стал этого делать из-за некоторых сложных языков, например японского.

Я пробовал:
  • Код: Выделить всё

    BackHandler {
    }. Он просто не срабатывает, когда пользователь пытается скрыть клавиатуру.
    [*]Модификатор для TextField с помощью focusRequester.captureFocus()
    . Я не знаю, помогает ли это захватить фокус, мое TextField - это всего лишь объект, который можно фокусировать, и он все равно всегда в фокусе, но это не мешает пользователю скрывать клавиатуру.
  • Повозился с TextInputService.startInput()
  • Повозился с TextInputService.startInput()
  • code>, есть поля onEditCommand и onImeActionPerformed, они также не срабатывают, когда пользователь скрывает клавиатуру.
  • То же самое касается KeyboardActions(onAny = {
    }), скрытие вызывает не запускать его.
  • KeyboardOptions, предоставленные для TextField(), не имеют соответствующих параметров.
  • Мне не нужна отдельная активность для поиска, но я попробовал Android :windowSoftInputMode="stateAlwaysVisible" в любом случае в манифесте. Это ничего не дало.
  • Код: Выделить всё

    LaunchedEffect(key1 = focusRequester) { keyboardController.show() }
    показывает клавиатуру, но ее можно скрыть.
  • Код: Выделить всё

    imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
    с токеном активности окна ничего не делал, насколько я понимаю, для Compose это не имеет значения.
И, возможно, более того, я уже устал, как собака :(

Подробнее здесь: https://stackoverflow.com/questions/783 ... in-compose
Ответить

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

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

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

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

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