Verwenden Sie eine Suchleiste, um die Suchfunktion zu implementieren. Eine Suchleiste ist ein dauerhaft sichtbares Suchfeld, in das Nutzer ein Keyword oder eine Wortgruppe eingeben können, um relevante Ergebnisse in Ihrer App aufzurufen. Sie wird empfohlen, wenn die Suche der primäre Fokus Ihrer App ist.
API-Oberfläche
Verwenden Sie das SearchBar-Composable, um Suchleisten zu implementieren. Die wichtigsten Parameter für diese zusammensetzbare Funktion sind:
inputField: Definiert das Eingabefeld der Suchleiste. Dabei wird in der RegelSearchBarDefaults.InputFieldverwendet, mit dem Folgendes angepasst werden kann:query: Der Abfragetext, der im Eingabefeld angezeigt werden soll.onQueryChange: Lambda zur Verarbeitung von Änderungen am Abfragestring.
expanded: Ein boolescher Wert, der angibt, ob die Suchleiste maximiert ist, um Vorschläge oder gefilterte Ergebnisse anzuzeigen.onExpandedChange: Lambda zur Verarbeitung von Änderungen am erweiterten Status des Drop-down-Menüs.content: Der Inhalt dieser Suchleiste, um Suchergebnisse unter derinputFieldanzuzeigen.
Suchleiste mit Vorschlägen
Dieses Snippet zeigt eine einfache Implementierung von SearchBar mit Vorschlägen:
@OptIn(ExperimentalMaterial3Api::class) @Composable fun SimpleSearchBar( textFieldState: TextFieldState, onSearch: (String) -> Unit, searchResults: List<String>, modifier: Modifier = Modifier ) { // Controls expansion state of the search bar var expanded by rememberSaveable { mutableStateOf(false) } Box( modifier .fillMaxSize() .semantics { isTraversalGroup = true } ) { SearchBar( modifier = Modifier .align(Alignment.TopCenter) .semantics { traversalIndex = 0f }, inputField = { SearchBarDefaults.InputField( query = textFieldState.text.toString(), onQueryChange = { textFieldState.edit { replace(0, length, it) } }, onSearch = { onSearch(textFieldState.text.toString()) expanded = false }, expanded = expanded, onExpandedChange = { expanded = it }, placeholder = { Text("Search") } ) }, expanded = expanded, onExpandedChange = { expanded = it }, ) { // Display search results in a scrollable column Column(Modifier.verticalScroll(rememberScrollState())) { searchResults.forEach { result -> ListItem( headlineContent = { Text(result) }, modifier = Modifier .clickable { textFieldState.edit { replace(0, length, result) } expanded = false } .fillMaxWidth() ) } } } } }
Wichtige Punkte zum Code
rememberSaveablesorgt dafür, dass der Status der Suchleiste (maximiert oder minimiert) bei Konfigurationsänderungen beibehalten wird. Der gespeicherte Wert wird in dassavedInstanceState-Bundle der Hosting-Aktivität geschrieben, bevor die Aktivität bei einer Konfigurationsänderung zerstört wird.- Der
semantics-Modifikator steuert die TalkBack-Reihenfolge.isTraversalGroupist fürBoxfestgelegt, um alle untergeordneten Composables zu gruppieren.traversalIndexwird festgelegt, um die Reihenfolge anzugeben, in der TalkBack die Barrierefreiheitsinformationen der einzelnen Gruppen-Peers vorliest. TalkBack liest Informationen zur Barrierefreiheit für einen Knoten mit einem negativen Wert, z. B.-1, vor einem Knoten mit einem positiven Wert, z. B.1, vor. Da der Wert ein Gleitkommawert ist, können Sie eine benutzerdefinierte Reihenfolge für viele Peers festlegen, indem Sie für jeden Peer Werte zwischen-1.0und1.0festlegen.
- Das
SearchBarenthält eininputFieldfür die Nutzereingabe und einColumnzum Anzeigen von Suchvorschlägen.SearchBarDefaults.InputFielderstellt das Eingabefeld und verarbeitet Änderungen an der Nutzeranfrage.onQueryChangeverarbeitet die Texteingabe und aktualisiert den Status, wenn sich der Text im Eingabefeld ändert.- Der Status von
The expandedsteuert die Sichtbarkeit der Vorschlagsliste.
searchResults.forEach { result -> … }durchläuft die ListesearchResultsund erstellt für jedes Ergebnis einListItem.- Wenn auf ein
ListItemgeklickt wird, wird dastextFieldStateaktualisiert, die Suchleiste wird minimiert und dastextFieldwird mit dem ausgewählten Suchergebnis gefüllt.
- Wenn auf ein
Ergebnis
Suchleiste mit gefilterter Liste
In diesem Beispiel wird ein SearchBar gezeigt, mit dem eine Liste anhand der Suchanfrage des Nutzers gefiltert wird:
@OptIn(ExperimentalMaterial3Api::class) @Composable fun CustomizableSearchBar( query: String, onQueryChange: (String) -> Unit, onSearch: (String) -> Unit, searchResults: List<String>, onResultClick: (String) -> Unit, modifier: Modifier = Modifier, // Customization options placeholder: @Composable () -> Unit = { Text("Search") }, leadingIcon: @Composable (() -> Unit)? = { Icon(Icons.Default.Search, contentDescription = "Search") }, trailingIcon: @Composable (() -> Unit)? = null, supportingContent: (@Composable (String) -> Unit)? = null, leadingContent: (@Composable () -> Unit)? = null, ) { // Track expanded state of search bar var expanded by rememberSaveable { mutableStateOf(false) } Box( modifier .fillMaxSize() .semantics { isTraversalGroup = true } ) { SearchBar( modifier = Modifier .align(Alignment.TopCenter) .semantics { traversalIndex = 0f }, inputField = { // Customizable input field implementation SearchBarDefaults.InputField( query = query, onQueryChange = onQueryChange, onSearch = { onSearch(query) expanded = false }, expanded = expanded, onExpandedChange = { expanded = it }, placeholder = placeholder, leadingIcon = leadingIcon, trailingIcon = trailingIcon ) }, expanded = expanded, onExpandedChange = { expanded = it }, ) { // Show search results in a lazy column for better performance LazyColumn { items(count = searchResults.size) { index -> val resultText = searchResults[index] ListItem( headlineContent = { Text(resultText) }, supportingContent = supportingContent?.let { { it(resultText) } }, leadingContent = leadingContent, colors = ListItemDefaults.colors(containerColor = Color.Transparent), modifier = Modifier .clickable { onResultClick(resultText) expanded = false } .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 4.dp) ) } } } } }
Wichtige Punkte zum Code
- Die Lambda-Funktion
onQueryChangewird immer dann aufgerufen, wenn der Nutzer Text in die Suchleiste eingibt oder daraus löscht. SearchBarDefaults.InputFieldenthält einleadingIcon, das dem Anfang des Eingabefelds ein Suchsymbol hinzufügt, und eintrailingIcon, das dem Ende des Eingabefelds ein Symbol für „Weitere Optionen“ hinzufügt. Hier können Sie dem Nutzer Sortier- und Filteroptionen zur Verfügung stellen.onSearch = { … }ruft die Lambda-FunktiononSearchauf und minimiert die Suchleiste, wenn die Suche gesendet wird.- Ein
LazyColumnkann eine potenziell große Anzahl von Suchergebnissen effizient verarbeiten. Die ListesearchResultswird durchlaufen und jedes Ergebnis alsListItemangezeigt. - Jede
ListItem-Composable-Funktion zeigt den Artikeltext, Text mit zusätzlichen Informationen und ein Sternsymbol alsleadingContentdes Artikels. In diesem Beispiel wird eine Option zum Favorisieren des Artikels angezeigt. - Die Filterlogik finden Sie unter
CustomizableSearchBarExampleim vollständigen Quellcode auf GitHub.
Ergebnis
Zusätzliche Ressourcen
- Material Design: Suchleiste