Utilizza una barra di ricerca per implementare la funzionalità di ricerca. Una barra di ricerca è un campo di ricerca persistente che consente agli utenti di inserire una parola chiave o una frase per visualizzare i risultati pertinenti all'interno dell'app. È consigliata quando la ricerca è l'obiettivo principale dell'app.
 
  Piattaforma API
Utilizza il componibile SearchBar per implementare le barre di ricerca. I parametri chiave per
questo componibile includono:
- inputField: definisce il campo di input della barra di ricerca. In genere utilizza- SearchBarDefaults.InputField, che consente la personalizzazione di:- query: il testo della query da mostrare nel campo di input.
- onQueryChange: Lambda per gestire le modifiche nella stringa di query.
 
- expanded: un valore booleano che indica se la barra di ricerca è espansa per mostrare suggerimenti o risultati filtrati.
- onExpandedChange: Lambda per gestire le modifiche nello stato espanso del menu a discesa.
- content: il contenuto di questa barra di ricerca per visualizzare i risultati di ricerca sotto- inputField.
Barra di ricerca con suggerimenti
Questo snippet mostra un'implementazione di base di SearchBar con suggerimenti:
@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() ) } } } } }
Punti chiave del codice
- rememberSaveablegarantisce che lo stato della barra di ricerca (espansa o compressa) venga mantenuto dopo le modifiche alla configurazione. Scrive il valore memorizzato nel bundle- savedInstanceStatedell'attività di hosting prima che l'attività venga eliminata durante una modifica della configurazione.
- Il modificatore semanticscontrolla l'ordine di attraversamento di TalkBack.- isTraversalGroupè impostato per- Boxper raggruppare tutti i relativi componenti componibili secondari.
- traversalIndexè impostato per specificare l'ordine in cui TalkBack legge le informazioni sull'accessibilità di ogni peer del gruppo. TalkBack legge le informazioni sull'accessibilità di un peer con un valore negativo, ad esempio- -1, prima di un peer con un valore positivo, ad esempio- 1. Poiché il valore è un numero in virgola mobile, puoi specificare un ordine personalizzato di molti peer impostando valori compresi tra- -1.0e- 1.0su ciascun peer.
 
- Il SearchBarcontiene uninputFieldper l'input dell'utente e unColumnper visualizzare i suggerimenti di ricerca.- SearchBarDefaults.InputFieldcrea il campo di input e gestisce le modifiche alla query dell'utente.
- onQueryChangegestisce l'input di testo e aggiorna lo stato ogni volta che il testo nel campo di input cambia.
- Lo stato di The expandedcontrolla la visibilità dell'elenco dei suggerimenti.
 
- searchResults.forEach { result -> … }esegue l'iterazione nell'- searchResultselenco e crea un- ListItemper ogni risultato.- Quando si fa clic su un ListItem, viene aggiornato iltextFieldState, la barra di ricerca viene compressa e iltextFieldviene compilato con il risultato di ricerca selezionato.
 
- Quando si fa clic su un 
Risultato
 
  Barra di ricerca con elenco filtrato
Questo esempio mostra un SearchBar che filtra un elenco in base alla query di ricerca dell'utente:
@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) ) } } } } }
Punti chiave del codice
- La funzione lambda onQueryChangeviene chiamata ogni volta che l'utente digita o elimina testo nella barra di ricerca.
- SearchBarDefaults.InputFieldcontiene un- leadingIcon, che aggiunge un'icona di ricerca all'inizio del campo di immissione, e un- trailingIcon, che aggiunge un'icona "Altre opzioni" alla fine del campo di immissione. Qui puoi fornire opzioni di ordinamento e filtro all'utente.
- onSearch = { … }chiama la lambda- onSearche comprime la barra di ricerca quando viene inviata la ricerca.
- Un LazyColumngestisce in modo efficiente un numero potenzialmente elevato di risultati di ricerca. Esegue l'iterazione nell'elencosearchResultse mostra ogni risultato comeListItem.
- Ogni composable ListItemmostra il testo dell'elemento, il testo che mostra informazioni aggiuntive e un'icona a forma di stella comeleadingContentdell'elemento. In questo esempio, viene visualizzata un'opzione per aggiungere l'elemento ai preferiti.
- Per la logica di filtraggio, consulta CustomizableSearchBarExamplenel codice sorgente completo su GitHub.
Risultato
 
  Risorse aggiuntive
- Material Design: barra di ricerca
