Fordern Sie Fokus auf TextField in jetpack compose an
Lesezeit: 5 Minuten
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
}
)
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
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:
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
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
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
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.
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.
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)
)
}
13940100cookie-checkFordern Sie Fokus auf TextField in jetpack compose anyes