Fordern Sie Fokus auf TextField in jetpack compose an

Lesezeit: 5 Minuten

Benutzeravatar von Mukul jangir
Mukul Jangir

So fokussieren Sie sich automatisch auf Textfelder in Jetpack Compose. Wenn ich auf das Textfeld klicke und anfange, darauf zu schreiben. Wenn ich in der Zwischenzeit auf die Schaltfläche “Zurück” klicke und dann versuche, auf das Textfeld zu klicken, passiert nichts.

val textState = remember { mutableStateOf(TextFieldValue()) }
TextField(
    modifier = Modifier.fillMaxWidth(),
    value = textState.value,
    onValueChange = { value : TextFieldValue ->
        textState.value = value
    }
)

Benutzeravatar von Ralston
Ralston

Veröffentlichung einer aktualisierten Antwort auf die Frage (APIs wurden in Compose Beta umbenannt)

@Composable
fun AutoFocusingText() {
    var value by mutableStateOf("Enter Text")
    val focusRequester = remember { FocusRequester() }
    TextField(
        value = value, 
        onValueChange = { value = it },
        modifier = Modifier.focusRequester(focusRequester)
    )
    
    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }
}

  • Dies funktioniert, setzt aber den Cursor an den Anfang des Wortes. Wie würde man den Cursor an das Ende des Wortes setzen, wenn man den Fokus anfordert?

    – Charles Woodson

    5. Mai 2021 um 21:59 Uhr

  • @CharlesWoodson müssen Sie verwenden TextFieldValue in dem TextFieldWert. Sie können die Auswahl einstellen TextFieldValue

    – Dummfinger

    6. Juli 2021 um 15:38 Uhr

  • @CharlesWoodson Wenn Sie den Cursor immer noch auf das Ende der Zeichenfolge im Textfeld setzen möchten, gehen Sie wie folgt vor: val textFieldValue = Remember { mutableStateOf ( TextFieldValue (someString, TextRange (someString.length)) ) Legen Sie den Wert fest des TextField zu textFieldValue.value wie diesem TextField( value = textFieldValue.value ) Dadurch wird das Textfeld mit someString vorbelegt und die Cursorposition wird die Länge von someString sein, die sich am Ende der Zeichenfolge befindet.

    – Anudeep Ananth

    12. Juli 2021 um 6:08 Uhr


  • Würde nicht LaunchedEffect besser verwenden statt DisposableEffect?

    – Anigif

    8. Dezember 2021 um 16:02 Uhr

  • @AnudeepAnanth mit Ihrem Code können wir den Cursor nicht wie das Standardverhalten verschieben, wir bekommen Probleme beim Bearbeiten des Textes

    – Mohd Qasim

    15. März um 13:00 Uhr

Benutzeravatar von Gabriele Mariotti
Gabriele Marotti

Du kannst den … benutzen FocusRequester mit Nebeneffekt.
Etwas wie:

var text by remember { mutableStateOf("text") }

// initialize focus reference to be able to request focus programmatically
val focusRequester = FocusRequester()

Column {
    TextField(
        value = text,
        onValueChange = {
            text = it
        },
        label = { Text("label") },
        modifier = Modifier
            // add focusRequester modifier 
            .focusRequester(focusRequester)
    )

Dann benutze focusRequester.requestFocus(). Auf diese Weise erteilt das System der damit verbundenen Komponente den Fokus FocusRequester.

Damit das Feld automatisch fokussiert wird, wenn der Bildschirm angezeigt wird, können Sie Folgendes verwenden:

LaunchedEffect(Unit) {
    focusRequester.requestFocus()
}

So weisen Sie dem Feld manuell den Fokus zu:

    Button(
         onClick = { focusRequester.requestFocus() }
    ){
        Text("Click to give the focus")
    }

  • Was ist der Vorteil der Verwendung DisposableEffect Über LaunchedEffect bei der automatischen Fokussierung des Feldes?

    – Danartillaga

    8. Oktober 2021 um 13:04 Uhr

  • Oder nur SideEffect die keine Coroutine startet oder implementieren muss onDispose?

    – Florian Walther

    14. Oktober 2021 um 7:50 Uhr

  • DisposableEffect wird verwendet, um den Fokus nur einmal anzufordern, aber es hat keine Bedeutung, da wir onDispose nicht verwenden. Daher denke ich, dass die Verwendung von LaunchedEffect(Unit){} sinnvoller ist, da es nur einmal gestartet wird, das erste Mal erstellt wird, und keine Fokussierung auf die Neuzusammensetzung anfordert.

    – Amr

    14. Oktober 2021 um 10:50 Uhr


  • und wie kann ich den fokus zurückziehen??

    – Tanjim Ahmed

    13. Dezember 2021 um 13:19 Uhr


  • @SvenJacobs Ja, das passiert nicht nur mit LaucnhedEffect sondern auch mit DisposableEffect. Sie sollten während der Komposition keinen Fokus anfordern. Die Lösung, die ich gefunden habe, besteht darin, direkt nach der Komposition einen Fokus anzufordern. Also, du wirst es tun LaunchedEffect(Unit) { this.coroutineContext.job.invokeOnCompletion { focusRequester.requestFocus() } } Dadurch wird sichergestellt, dass Ihr Code ausgeführt wird, wenn die LauchedEffect verlässt die Komposition, weil sie (die Coroutine) entweder abgebrochen oder abgeschlossen wurde.

    – Benjam

    31. Januar um 15:08 Uhr

Benutzeravatar von toutoumu
toutoumu

val focusRequester = remember { FocusRequester() }
val inputService = LocalTextInputService.current
val focus = remember { mutableStateOf(false) }
BasicTextField(
    value = "value",
    modifier = Modifier
        .height(40.dp)
        .fillMaxWidth()
        .focusRequester(focusRequester)
        .onFocusChanged {
            if (focus.value != it.isFocused) {
                focus.value = it.isFocused
                if (!it.isFocused) {
                    inputService?.hideSoftwareKeyboard()
                }
            }
        },
),

LaunchedEffect("") {
    delay(300)
    inputService?.showSoftwareKeyboard()
    focusRequester.requestFocus()
}

  • Bitte geben Sie in Ihrer Antwort weitere Details an. Wie es derzeit geschrieben ist, ist es schwer, Ihre Lösung zu verstehen.

    – Gemeinschaft
    bot

    9. September 2021 um 7:01 Uhr

Benutzeravatar von 2jan222
2. Januar 222

Von Compose Unit Tests übernommen und auf TextField angewendet Verknüpfung

    @ExperimentalFocus
    @Composable
    fun AutoFocusingText() {
        val textState = remember { mutableStateOf(TextFieldValue()) }
        val focusState = remember { mutableStateOf(FocusState.Inactive) }
        val focusRequester = FocusRequester()
        val focusModifier = Modifier.focus()
        Row(
            modifier = Modifier.focusObserver { focusState.value = it }
        ) {
            val focusRequesterModifier = Modifier.focusRequester(focusRequester)
            TextField(
                modifier = focusModifier.then(focusRequesterModifier),
                value = textState.value,
                onValueChange = { value: TextFieldValue ->
                    textState.value = value
                },

                )
        }
        onActive {
            focusRequester.requestFocus()
        }
    }

Bearbeiten: Box in Row geändert, da Box in ‘1.0.0-alpha04’ veraltet ist

Benutzeravatar von Benyam
Benjam

Wenn Sie möchten, dass Ihr Textfeld automatisch fokussiert wird, wenn Sie zum Bildschirm navigieren, können Sie dies verwenden. Dies erlaubt Ihnen nicht requestFocus während der Komposition, was Sie nicht tun sollten. Sonst bekommt man IllegalStateException mit der Meldung “FocusRequester ist nicht initialisiert”.

 @Composable fun YourComposable(){ 
   val focusRequester = remember {FocusRequester()}
    
        LaunchedEffect(Unit) {
            this.coroutineContext.job.invokeOnCompletion {
                focusRequester.requestFocus()
            }
        }
    
       OutlinedTextField( modifier = Modifier.focusRequester(focusRequester))
         
              
}

Dies liegt an der Koroutine im Inneren LaucnhedEffeect wird abgesagt, wenn die LaunchedEffect verlässt die Komposition.

Benutzeravatar von Suraj Rao
Suraj Rao


    @Composable fun SomeComposable() {
        val focusRequester = remember { FocusRequester() }

    OutlinedTextField(
        value = TextFieldValue(
        text = state.text, // state come from else where
        selection = TextRange(state.text.length,state.text.length)),  
   
        onValueChange = { _:TextFieldValue -> Unit },
        modifier = Modifier
          .fillMaxWidth()
          .focusRequester(focusRequester),)

    SideEffect {
        focusRequester.requestFocus()
        }
    }

Warum SideEffect: die allererste Zeile von die Dokumente.
Für die Cursorposition hat diese Antwort geholfen.
onValueChanged so belassen wird, wie es in meinem Arbeitscode ist, brauche ich es nicht.

Benutzeravatar von Mohd Qasim
Mohd Qasim

Bewegen Sie den Cursor auf die Länge des Textes und erlauben Sie dem Benutzer, den Cursor weiter zu bewegen Textfeld mit folgendem Code

 @Composable
    fun AutoFocusingText(value:String,onValueChange: (newValue: String) -> Unit) {
    var textFieldValueState by remember { mutableStateOf(TextFieldValue(text = value,selection = TextRange(value.length))) }
    val textFieldValue = textFieldValueState.copy(text = value)
    val focusRequester = FocusRequester()
    DisposableEffect(Unit) {
        focusRequester.requestFocus()
        onDispose { }
    }
    TextField(
        value = textFieldValue,
        onValueChange = {
            textFieldValueState = it
            if (value != it.text) {
                onValueChange(it.text)
            } },
        modifier = Modifier.focusRequester(focusRequester = focusRequester)
    )


}

1394010cookie-checkFordern Sie Fokus auf TextField in jetpack compose an

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

Privacy policy