簡體   English   中英

如何在沒有 TextField 的情況下在 Jetpack Compose 中收聽鍵盤事件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM