Wie entwickeln Sie mit Jetpack Compose eine Funktion, die Zeichen innerhalb einer Zeichenfolge hervorhebt, die mit der EAndroid

Forum für diejenigen, die für Android programmieren
Guest
 Wie entwickeln Sie mit Jetpack Compose eine Funktion, die Zeichen innerhalb einer Zeichenfolge hervorhebt, die mit der E

Post by Guest »

Wie entwickelt man mit Jetpack Compose eine Funktion, die die Farbe von Zeichen innerhalb einer Zeichenfolge ändert, die mit dem in ein Textfeld eingegebenen Text übereinstimmen?
Dies ist eine häufige Funktion in Anwendungen die es Benutzern ermöglichen, mithilfe einer Suchleiste eine Liste zu durchsuchen und passende Ergebnisse zurückzugeben. Die Zeichen innerhalb des Listenelements, die mit dem in eine Suchleiste eingegebenen Text übereinstimmen, haben eine andere Farbe als die Zeichen, die nicht übereinstimmen.
Das einzige Problem ist, dass ich es nicht ganz kann Erfahren Sie, wie Sie diese Funktion richtig implementieren. Ich habe eine Funktion entwickelt, die diesem Ziel sehr nahe kommt, aber ein wenig hinterherhinkt.
Hier ist der Code für das, was ich bisher erreicht habe.

Code: Select all

val searchValue by remember {mutableStateOf(TextFieldValue(""))}
val nameList = listOf("John", "Brittany", "Rick", "Jill", "Eric", "Alex", "Aaron")

Scaffold(
topBar = {
// SEARCH BAR; THE LIST IS RECOMPOSED ON EVERY INPUT
TextField(
value = searchValue,
onValueChange = {
searchValue = it
nameList.filter { it.contains(searchValue.text, ignoreCase = true) }
})
}
) {padding ->
LazyColumn(
modifier = Modifier.padding(padding)
) {

// DISPLAYED LIST OF MATCHING NAMES
items(if (searchValue.text.isEmpty()) emptyList() else nameList.filter { it.contains(searchValue.text, ignoreCase = true) }) { name ->

Text(
// ANNOTATED STRING THAT PARSES EACH CHARACTER IN A LIST ITEM
buildAnnotatedString {
name.forEach { letterInName ->
// IF THE CHARACTER MATCHES THEN THE TEXT CHANGES TO BLUE
if (letterInName.toString() in searchValue.text) {
withStyle(style = SpanStyle(color = Color.Blue)) { append(letterInName.toString()) }
// ELSE BLACK
} else {
withStyle(style = SpanStyle(color = Color.Black)) { append(letterInName.toString()) }
}
}
}
)

}

}
}
Dieses System erreicht fast das, was ich will, aber es gibt ein Problem. Wenn in einer Zeile eine Folge gleicher Zeichen vorhanden ist, werden alle hervorgehoben, unabhängig davon, wie viele Zeichen sich in der Suchleiste befinden.
Zum Beispiel im Namen „Jill " Beide „L“ werden hervorgehoben, auch wenn nur ein „L“ in der Suchleiste vorhanden ist. Das gleiche Problem tritt mit dem „A“ in „Aaron“ auf. Beide werden hervorgehoben, unabhängig davon, wie viele sich in der Suchleiste befinden.
Wie kann ich dieses Problem beheben? Stellen Sie sicher, dass nur die Zahl eines bestimmten in die Suchleiste eingegebenen Zeichens hervorgehoben wird.
Vielen Dank, dass Sie sich die Zeit genommen haben, diese Frage zu lesen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post