Compose中强制显示软键盘并拦截隐藏事件的实现问题
POS应用搜索界面软键盘控制问题
我正在开发POS应用的搜索界面,要求TextField存在时始终显示软键盘,理想状态是能拦截用户隐藏键盘的操作,直接随键盘隐藏搜索组件。
当前实现代码
@Composable fun Search(onHide: () -> Unit) { var query by rememberSaveable { mutableStateOf("") } BackHandler { onHide() //仅在键盘已隐藏时生效 } 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() //获取焦点后键盘会自动显示 } }
组件使用上下文
fun Content() { var searchMode by rememberSaveable { mutableStateOf(true) } //FIXME false AppTheme { Surface { if (searchMode) { Search(onHide = { searchMode = false }) } else { /* 应用常规内容 */ } } } }
额外问题
- 实现软键盘无动画显示/隐藏
- 移除GBoard顶部工具栏(操作、贴纸、剪贴板、语音输入),目前用
KeyboardType.Password在我的设备上可行,但不是通用方案
如果上述需求无法实现,是不是只能用自定义应用内键盘?我不想这么做,日语等复杂语言的适配难度太高。
已尝试方案
BackHandler { <breakpoint> }:用户尝试隐藏键盘时不会触发- 为TextField添加
focusRequester.captureFocus():不确定是否成功捕获焦点,我的TextField已是唯一可聚焦组件且始终处于聚焦状态,但无法阻止用户隐藏键盘 - 尝试
TextInputService.startInput():其中的onEditCommand和onImeActionPerformed在用户隐藏键盘时不触发 KeyboardActions(onAny = { <breakpoint> }):同样不会在键盘隐藏时触发- TextField的
KeyboardOptions中无相关配置项 - 在Manifest中设置
android:windowSoftInputMode="stateAlwaysVisible":无效果(不想为搜索单独创建Activity) LaunchedEffect(key1 = focusRequester) { keyboardController.show() }:可以显示键盘,但用户仍可手动隐藏- 通过Activity的window token调用
imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0):无效果,据我理解该方法不适用于Compose
我已经试了很多方法,现在真的累了:(
内容的提问来源于stack exchange,提问作者multistackdeveloper
相关产品推荐
相关产品推荐

