我正在进行文本输入,但无法使用 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))
}
}
结果如下:
关于android - 如何在没有 TextField 的情况下监听 Jetpack Compose 中的键盘事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72474483/