Wie schließe ich die virtuelle Tastatur von einem Jetpack Compose TextField?

Lesezeit: 4 Minuten

Benutzer-Avatar
Englauber

Ich verwende Jetpack Compose TextField und ich möchte die virtuelle Tastatur schließen, wenn der Benutzer die Aktionstaste (imeActionPerformed Parameter).

val text = +state { "" }
TextField(
    value = text.value,
    keyboardType = KeyboardType.Text,
    imeAction = ImeAction.Done,
    onImeActionPerformed = { 
        // TODO Close the virtual keyboard here <<<
    }
    onValueChange = { s -> text.value = s }
)

Benutzer-Avatar
Gabriele Marotti

Du kannst den … benutzen LocalSoftwareKeyboardController Klasse, um die aktuelle Software-Tastatur zu steuern und dann die zu verwenden hide Methode:

var text by remember { mutableStateOf(TextFieldValue("Text")) }
val keyboardController = LocalSoftwareKeyboardController.current

TextField(
        value = text,
        onValueChange = {
            text = it
        },
        label = { Text("Label") },
        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
        keyboardActions = KeyboardActions(
                onDone = {keyboardController?.hide()})
)

Diese Lösung schließt die Tastatur ohne Entfernen des Fokus vom Strom TextField.

Nur um den Unterschied hervorzuheben mit:

val focusManager = LocalFocusManager.current
focusManager.clearFocus()

Dieser Code schließt die Tastatur und entfernt den Fokus von der Textfeld.

  • Das ist der Traum eines jeden Android-Entwicklers

    – Andreas Chelix

    14. April 2021 um 10:29 Uhr

  • Was sind die Unterschiede zwischen diesem und dem FocusManager-Ansatz (stackoverflow.com/a/66259111/2911458)? Wann sollten wir sie verwenden?

    – stkent

    22. Mai 2021 um 23:10 Uhr

  • @stkent Diese Lösung verbirgt nur die Tastatur. Die andere Lösung entfernt auch den Fokus vom aktuellen TextField (der Cursor wird immer noch angezeigt, er könnte immer noch hervorgehoben sein usw.)

    – m.reiter

    4. August 2021 um 9:25 Uhr

  • Achten Sie bei der Wahl zwischen beiden Lösungen bitte auch auf ux-continuity: Das Default-Verhalten: Einmaliges Zurückwischen blendet die Tastatur aus, zweites Wischen löscht den Fokus.

    – m.reiter

    4. August 2021 um 9:31 Uhr

  • @stkent Weitere Details finden Sie in meiner Antwort unter stackoverflow.com/a/68650009/12871582

    – m.reiter

    4. August 2021 um 14:58 Uhr

Benutzer-Avatar
Azizbekisch

Ausgehend von komponieren 1.0.0-alpha12 (und immer noch gültig in compose 1.2.0) das onImeActionPerformed ist veraltet und der vorgeschlagene Ansatz ist zu verwenden keyboardActions mit Kombination aus keyboardOptions:

    val focusManager = LocalFocusManager.current

    OutlinedTextField(
        value = ...,
        onValueChange = ...,
        label = ...,
        keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
        keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done, keyboardType = KeyboardType.Password),
    )

focusManager.clearFocus() kümmert sich um die Entlassung der Soft-Tastatur.

Benutzer-Avatar
m.reiter

Im 1.0.0 Sie können entweder verwenden SoftwareKeyboardController oder FocusManager um dies zu tun.

Diese Antwort konzentriert sich auf ihre Unterschiede.


Konfiguration:

var text by remember { mutableStateOf("")}

TextField(
    value = text,
    onValueChange = { text = it },
    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
    keyboardActions = KeyboardActions(onDone = { /* TODO */ }),
)

Konfiguration


SoftwareKeyboardController:

Bezogen auf @Gabriele Mariottis Antworten.

val keyboardController = LocalSoftwareKeyboardController.current

// TODO =
keyboardController?.hide()

Dies schließt nur die Tastatur, tut es aber NICHT Löschen Sie den Fokus von jedem fokussierten TextField (beachten Sie den Cursor und die dicke Unterstreichung).

Tastatur-Controller verwenden


FokusManager:

Bezogen auf @azizbekians Antworten.

val focusManager = LocalFocusManager.current

// TODO =
focusManager.clearFocus()

Fokus-Manager verwenden

Dies schließt die Tastatur UND löscht den Fokus vom TextField.

Ausblenden der Tastatur beim Klicken auf die Schaltfläche

Um mit der Lösung von Gabriele Mariotti hinzuzufügen, wenn Sie die Tastatur bedingt ausblenden möchten, z. B. nach einem Tastenklick, verwenden Sie Folgendes:

keyboardController?.hide()

Blenden Sie beispielsweise die Tastatur aus, nachdem Sie auf die Schaltfläche Hinzufügen geklickt haben:

var newWord by remember { mutableStateOf("") }
val keyboardController = LocalSoftwareKeyboardController.current

// Setup the text field with keyboard as provided by Gabriele Mariotti

...

Button(
        modifier = Modifier
                .height(56.dp),
        onClick = {
                if (!newWord.trim().isNullOrEmpty()) {
                        wordViewModel.onAddWord(newWord.trim())
                        newWord = ""
                        keyboardController?.hide()
                }
        ...

Benutzer-Avatar
Englauber

Bearbeiten nach der Veröffentlichung von Alpha-12:
Siehe Antwort von @azizbekian.

Pre-Alpha-12-Antwort

Hier habe ich die Lösung gefunden 🙂

fun hideKeyboard(activity: Activity) {
    val imm: InputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    var view = activity.currentFocus
    if (view == null) {
        view = View(activity)
    }
    imm.hideSoftInputFromWindow(view.windowToken, 0)
}

Ich muss nur die obige Funktion von meiner Komponente aufrufen:

// getting the context
val context = +ambient(ContextAmbient)

// textfield state
val text = +state { "" }

TextField(
    value = text.value,
    keyboardType = KeyboardType.Text,
    imeAction = ImeAction.Done,
    onImeActionPerformed = { 
        if (imeAction == ImeAction.Done) {
            hideKeyboard(context as Activity)
        }
    }
    onValueChange = { s -> text.value = s }
)

Benutzer-Avatar
Schraube UIX

Implementierung „androidx.compose.material3:material3:1.0.0-alpha02“

Textfeld mit Tastatur bei Ime-Aktion ausblenden

@OptIn(ExperimentalComposeUiApi::class)
    @Composable
    fun TextFieldWithHideKeyboardOnImeAction() {
        val keyboardController = LocalSoftwareKeyboardController.current
        var text by rememberSaveable { mutableStateOf("") }
        TextField(
            value = text,
            onValueChange = { text = it },
            label = { Text("Label") },
            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
            keyboardActions = KeyboardActions(
                onDone = {
                    keyboardController?.hide()
                    // do something here
                }
            )
        )
    }

Textfeld mit Tastatur bei Ime-Aktion ausblenden

Ich habe einen Weg gefunden, ihn im CoreTextField herunterzufahren, benutze TextInputService, um den Schalter zu steuern

val focus = LocalTextInputService.current
var text by remember{ mutableStateOf("")}
TextField(
    value = text,
    onValueChange = { text = it },
    keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done, keyboardType = KeyboardType.Text),
    keyboardActions = KeyboardActions(onDone = { focus?.hideSoftwareKeyboard() }),
    singleLine = true
)

  • Siehe “Erläutern vollständig codebasierter Antworten”. Obwohl dies technisch korrekt sein mag, erklärt es nicht, warum es das Problem löst oder die ausgewählte Antwort sein sollte. Wir sollten aufklären und dabei helfen, das Problem zu lösen.

    – der Blechmann

    22. März um 4:48 Uhr

1231160cookie-checkWie schließe ich die virtuelle Tastatur von einem Jetpack Compose TextField?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy