android - 如何在没有 TextField 的情况下监听 Jetpack Compose 中的键盘事件?

标签 android android-jetpack-compose

我正在进行文本输入,但无法使用 TextField。我需要 TextField 不支持的文本转换。

如何获取软件/屏幕键盘事件?

Modifier.onKeyEvent() 对我不起作用,因为由于某种原因它只适用于硬件键盘。

这应该很容易,对吧?我还没有找到解决办法。

最佳答案

我找到了一种方法...也许不是最优雅的,但它有效...

首先,在您的 Activity 中,捕获关键事件并通过 broadcast 发送它.

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    LocalBroadcastManager.getInstance(this).sendBroadcast(
        Intent("key_up").apply {
            putExtra("event", event)
        }
    )
    return super.onKeyUp(keyCode, event)
}

然后在下面声明函数(无论您想要在哪里)。它负责打开键盘。

suspend fun openKeyboard(context: Context) {
    val myView = (context as Activity).findViewById<View>(android.R.id.content)
    val inputMethodManager = 
        context.getSystemService(INPUT_METHOD_SERVICE) as? InputMethodManager
    delay(500) // it didn't work without the delay...
    inputMethodManager?.toggleSoftInputFromWindow(
        myView.applicationWindowToken,
        InputMethodManager.SHOW_FORCED,
        0
    )
}

最后,这是可组合项。

@ExperimentalComposeUiApi
@Composable
fun FakeInput() {
    var keyCode by remember { // last key pressed
        mutableStateOf("")
    }
    val ctx = LocalContext.current
    LaunchedEffect(Unit) {
        openKeyboard(ctx)
    }
    DisposableEffect(Unit) {
        val lbm = LocalBroadcastManager.getInstance(ctx)
        // Receiver for key events 
        val receiver = object : BroadcastReceiver() {
            override fun onReceive(ctx: Context?, intent: Intent?) {
                intent?.getParcelableExtra<KeyEvent>("event")?.let { keyEvent ->
                    keyCode = keyEvent.displayLabel.toString()
                }
            }
        }
        // registering the receiver
        lbm.registerReceiver(receiver, IntentFilter("key_up"))
        onDispose {
            // unregistering when the composable is disposed
            lbm.unregisterReceiver(receiver)
        }
    }
    Box(Modifier.fillMaxSize()) {
        Text(text = keyCode, Modifier.align(Alignment.Center))
    }
}

结果如下:

enter image description here

关于android - 如何在没有 TextField 的情况下监听 Jetpack Compose 中的键盘事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72474483/

相关文章:

android - java.lang.IllegalStateException : Composition requires an active composition context (Android Jetpack Compose)

Android Jetpack Compose mutableStateListOf 不做重组

android - 带圆角的波纹 Jetpack Compose

Android:onUpgrade 不在数据库升级时调用

android - 两个 robotium 测试用例,但第二个卡在那里没有响应(在 JUnit View 中)

android - Jetpack Compose 智能重组

android - 如何使用 Jetpack Compose 在 Android 中添加图像

android - 协程不并行运行

android - 在分析包含 retrolambda 的类时,Lint 崩溃并出现异常

android - 在下载信息时向显示 "Loading"的 ListView 添加一行。就像在市场上