Jak zvládnout klíčové události během TextField úpravy v Kompozici?

0

Otázka

Dělám šachy motor na plochu komponovat, jedna z věcí, které jsem se snaží realizovat je TextField kde si můžu vložit v několika tahů, obnovit hry.

Já jsem s problémy při ukládání text, který vložím do mého TextField composable.

Můj text composable je takto, chápu, že s mým současným provádění tiskne pokaždé, když přesunout proměnná se změní, ale jen jsem chtěl, aby se to stalo, když jsem stiskněte klávesu ZADEJTE klávesy na mé klávesnice.

Jsem pomocí print vyzkoušet nějaký kód, ale to, co chci udělat, je uložit Řetězec do seznamu nebo něco, ale že mohu realizovat v mém vlastním později.

Jen jsem se najít vysvětlení, jak to udělat s operačním systémem android a android specifické metody.

Text("   Play", textAlign = TextAlign.Center, fontSize = 30.sp)
val move = remember { mutableStateOf("Play") }
TextField(
    value = move.value,
    onValueChange = { move.value = it },
    label = { Text("Move") },
    maxLines = 1,
    textStyle = TextStyle(color = Color.Black, fontWeight = FontWeight.Bold),
    modifier = Modifier.padding(20.dp)
)
println(move.value)

To bylo poukázal na mě řešením zvládnout ZADEJTE keybind jako byly zodpovězeny zde: Jak spustit PC Klávesnice, vstupy v Kotlin Desktop Skládat Já jsem jen mít trochu problémy, že jsem stiskněte klávesu ENTER nelze zpracovat Řetězec, když jsem stiskněte klávesu ENTER tiskne spojitě isntead pouze jednou na základě mého výzkumu jsem se třeba zavést něco jako toto: Box není zachytit klíčové události v Kompozici Plochy ale nemůžu se zdají být schopen použít KeyEvent.ACTION_UP nejsem si jistý, jestli je to specifické pro editText, pokud mi chybí nějaký dovoz, nebo jestli je jiný způsob, jak to udělat s TextField composable.

Můj kód po dané návrhy

val requester = remember { FocusRequester() }
LaunchedEffect(Unit) {
    requester.requestFocus()
}
Text("   Play", textAlign = TextAlign.Center, fontSize = 30.sp)
val move = remember { mutableStateOf("Play") }
TextField(
    value = move.value,
    onValueChange = { move.value = it },
    label = { Text("Move") },
    maxLines = 1,
    textStyle = TextStyle(color = Color.Black, fontWeight = FontWeight.Bold),
    modifier = Modifier.padding(20.dp)
        .onKeyEvent {
    //if(keyCode==KeyEvent.KEYCODE_ENTER&&event.action==KeyEvent.ACTION_UP){
            if (it.key == Key.Enter) {
                println(move.value)
                true
            } else {
                // let other handlers receive this event
                false
            }
        }
        .focusRequester(requester)
        .focusable()
)

Podařilo se tento problém vyřešit změnou, pokud stav na toto:

if (it.key == Key.Enter && move.value!="") {
    println(move.value)
    move.value = ""
    true
}

Tak, že pokaždé, když jsem se něco napsat a stiskněte klávesu ENTER to vytiskne Řetězec a vymaže mutableState, a zatímco VSTUP je stále stisknuto nebude tisknout, protože mutableState je prázdný Řetězec. Stále hledám lepší řešení, než tohle

1

Nejlepší odpověď

1

Můžete zachytit klíčové události s Modifier.onKeyEvent. S textové pole nepotřebujete žádné zaměření zachytit, protože je to už tam. Pokud budete muset udělat to samé pro vlastní názor, podívejte se na tuto odpověď

Zjistit, které tlačítko bylo stisknuto můžete použít keya podívejte se, kde to bylo propuštěno, můžete zkontrolovat type:

TextField(
    value = text,
    onValueChange = { text = it },
    modifier = Modifier
        .onKeyEvent { keyEvent ->
            if (keyEvent.key != Key.Enter) return@onKeyEvent false
            if (keyEvent.type == KeyEventType.KeyUp) {
                println("Enter released")
            }
            true
        }
)
2021-11-25 02:03:13

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................