我正在POS应用程序中制作搜索屏幕,并希望在文本字段存在时始终显示软件键盘.理想情况下,我想拦截用户将键盘隐藏到hide my search widget together with keyboard的事件.

目前我有

@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. Code在我的设备上完成了GBoard的工作,但总体上感觉不太对劲.

这些可能是相关的,因为如果也不可能,使用自定义应用内键盘是我的最佳 Select 吗?我宁愿不这样做,因为日本等一些棘手的地方.


我try 过:

  1. BackHandler { <breakpoint> }.当用户试图隐藏键盘时,它根本不会被触发.
  2. 文本字段的修改器为focusRequester.captureFocus().Idk如果它有助于捕捉焦点,我的文本字段只是可聚焦的东西,并且无论如何始终聚焦,但它并不能阻止用户隐藏键盘.
  3. 摆弄TextInputService.startInput(),在EditCommands和onImeDelivered上有字段,当用户隐藏键盘时,它们也不会被触发
  4. KeyboardActions(onAny = { <breakpoint> })也是如此,隐藏不会触发它.
  5. 提供给TextField()的Keyboard选项没有相关选项
  6. 我不想单独的搜索活动,但无论如何在Manifest中try 了android:windowSoftInputMode="stateAlwaysVisible"个.它什么也没做.
  7. LaunchedEffect(key1 = focusRequester) { keyboardController.show() }显示键盘,但仍然可以隐藏.
  8. imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)带有活动窗口标志,什么也没做,据我所知,这与作曲无关.

也许更重要的是,我已经累了:(

推荐答案

"隐藏键盘"键码为17179869184(按this计算),因此可以通过拦截键来防止隐藏键盘动作.Image

var value by remember { mutableStateOf("") }
var isFocused by remember { mutableStateOf(false) }

TextField(
    value = value,
    onValueChange = { value = it },
    modifier = Modifier
        .onPreInterceptKeyBeforeSoftKeyboard {
            if (it.key.keyCode == 17179869184 && isFocused) {
                true
            } else {
                false
            }
        }
        .onFocusChanged {
            isFocused = it.isFocused
            setSoftKeyboardVisibility(isFocused)
        }
)

private fun ComponentActivity.setSoftKeyboardVisibility(isVisible: Boolean) {
    currentFocus?.let { currentFocus ->
        with(WindowInsetsControllerCompat(window, currentFocus)) {
            if (isVisible) {
                show(WindowInsetsCompat.Type.ime())
            } else {
                hide(WindowInsetsCompat.Type.ime())
            }
        }
    }
}

不幸的是,该解决方案不涵盖某些情况.当手势导航栏功能打开时,键盘将通过向后滑动手势隐藏. Image(Swipe Gesture)

还可能有其他方法来隐藏键盘,不仅是每个设备,而且是软件键盘. 因此,我认为实现自定义应用内键盘是确保键盘可见性的最佳方法.

Android相关问答推荐

ava.lang. ClassNotFound异常:没有找到类com.example.myapp.MyApp"

滑动以更改合成中的活动

KMM项目生成错误-';在项目';中找不到测试类:共享';

有没有办法知道每台安卓设备上的通知限制?

Android意图过滤器不限制应用程序仅处理YouTube链接

组成底部导航栏,自定义形状,周围透明

Jetpack Compose-如何使用值动画直接控制其他动画

如何在android库中关联应用程序链接?

如何在卡片视图右侧添加箭头

我需要在房间数据库中保留旧的自动迁移行吗?

Android Studio Relay插件(版本0.3.07)错误

在段的中心绘制饼图(甜甜圈图)的图例

当手表与手机断开连接时,有没有办法在我的 Wear OS 应用程序中显示操作系统级别的图标?

如何将一个没有 GRADLE 的古老 Android 项目导入到今天的 Android Studio 中?

Jetpack Compose 重组竞争条件

Jetpack compose 未解决的参考错误

为什么我不能直接记住 mutableStateOf 可组合函数?

如何在jetpack compose中创建水印文字效果

对话框中的内容不可见

在 android-billing-5.0 中获取 ProductDetails 价格