Я создаю экран поиска в приложении POS и хочу, чтобы программная клавиатура всегда отображалась, пока присутствует TextField. В идеале я хочу перехватить событие, когда пользователь скрывает клавиатуру, чтобы скрыть виджет поиска вместе с клавиатурой.
В настоящее время у меня есть
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" в любом случае в манифесте. Это ничего не дало.
Я создаю экран поиска в приложении POS и хочу, чтобы программная клавиатура всегда отображалась, пока присутствует TextField. В идеале я хочу перехватить событие, когда пользователь скрывает клавиатуру, чтобы [b]скрыть виджет поиска вместе с клавиатурой[/b]. В настоящее время у меня есть [code]@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 } } [/code] Для контекста я использую это следующим образом: [code]fun Content() { var searchMode by rememberSaveable { mutableStateOf(true) } //FIXME false AppTheme { Surface { if (searchMode) { Search(onHide = { searchMode = false }) } else { /* normally available activtiy contents */ } } } } [/code] Бонусные вопросы: [list] [*]показать/скрыть клавиатуру без анимации [*]удалить верхняя панель GBoard (действия, стикеры, буфер обмена, голосовой ввод). KeyboardType.Password выполняет работу для GBoard на моем устройстве, но в целом это не совсем правильно. [/list] Это, вероятно, актуально, потому что если это тоже так невозможно. Лучше всего использовать специальную клавиатуру в приложении? Я бы не стал этого делать из-за некоторых сложных языков, например японского.
Я пробовал: [list] [*][code]BackHandler { }. Он просто не срабатывает, когда пользователь пытается скрыть клавиатуру. [*]Модификатор для TextField с помощью focusRequester.captureFocus()[/code]. Я не знаю, помогает ли это захватить фокус, мое TextField - это всего лишь объект, который можно фокусировать, и он все равно всегда в фокусе, но это не мешает пользователю скрывать клавиатуру. [*]Повозился с TextInputService.startInput() [*]Повозился с TextInputService.startInput() [*] code>, есть поля onEditCommand и onImeActionPerformed, они также не срабатывают, когда пользователь скрывает клавиатуру. [*]То же самое касается KeyboardActions(onAny = { }), скрытие вызывает не запускать его. [*]KeyboardOptions, предоставленные для TextField(), не имеют соответствующих параметров. [*]Мне не нужна отдельная активность для поиска, но я попробовал Android :windowSoftInputMode="stateAlwaysVisible" в любом случае в манифесте. Это ничего не дало. [*][code]LaunchedEffect(key1 = focusRequester) { keyboardController.show() }[/code] показывает клавиатуру, но ее можно скрыть. [*][code]imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)[/code] с токеном активности окна ничего не делал, насколько я понимаю, для Compose это не имеет значения. [/list] И, возможно, более того, я уже устал, как собака :(