![](/img/trans.png)
[英]How to close the virtual keyboard from a Jetpack Compose TextField?
[英]How to listen to keyboard events in Jetpack Compose WITHOUT a TextField?
我在無法使用 TextField 的地方進行文本輸入。 我需要 TextField 不支持的文本轉換。
如何獲取軟件/屏幕鍵盤事件?
Modifier.onKeyEvent() 對我不起作用,因為出於某種原因它僅適用於硬件鍵盤。
這應該很容易吧? 我還沒有找到解決方案。
我找到了一種方法......也許不是最優雅的,但它有效......
首先,在您的活動中,捕獲關鍵事件並通過廣播發送。
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))
}
}
結果如下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.