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.InputField
verwendet, 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 derinputField
anzuzeigen.
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
rememberSaveable
sorgt 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.isTraversalGroup
ist fürBox
festgelegt, um alle untergeordneten Composables zu gruppieren.traversalIndex
wird 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.0
und1.0
festlegen.
- Das
SearchBar
enthält eininputField
für die Nutzereingabe und einColumn
zum Anzeigen von Suchvorschlägen.SearchBarDefaults.InputField
erstellt das Eingabefeld und verarbeitet Änderungen an der Nutzeranfrage.onQueryChange
verarbeitet die Texteingabe und aktualisiert den Status, wenn sich der Text im Eingabefeld ändert.- Der Status von
The expanded
steuert die Sichtbarkeit der Vorschlagsliste.
searchResults.forEach { result -> … }
durchläuft die ListesearchResults
und erstellt für jedes Ergebnis einListItem
.- Wenn auf ein
ListItem
geklickt wird, wird dastextFieldState
aktualisiert, die Suchleiste wird minimiert und dastextField
wird 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 basierend auf 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, // 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, modifier: Modifier = Modifier ) { // 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
onQueryChange
wird immer dann aufgerufen, wenn der Nutzer Text in die Suchleiste eingibt oder löscht. SearchBarDefaults.InputField
enthä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-FunktiononSearch
auf und minimiert die Suchleiste, wenn die Suche gesendet wird.- Ein
LazyColumn
verarbeitet eine potenziell große Anzahl von Suchergebnissen effizient. Die ListesearchResults
wird durchlaufen und jedes Ergebnis alsListItem
angezeigt. - Jede
ListItem
-Composable-Funktion zeigt den Artikeltext, Text mit zusätzlichen Informationen und ein Sternsymbol alsleadingContent
des Artikels. In diesem Beispiel wird eine Option zum Favorisieren des Artikels angezeigt. - Die Filterlogik finden Sie unter
CustomizableSearchBarExample
im vollständigen Quellcode auf GitHub.
Ergebnis

Zusätzliche Ressourcen
- Material Design: Suchleiste