Utilisez une barre de recherche pour implémenter la fonctionnalité de recherche. Une barre de recherche est un champ de recherche persistant qui permet aux utilisateurs de saisir un mot clé ou une expression pour afficher des résultats pertinents dans votre application. Elle est recommandée lorsque la recherche est l'objectif principal de votre application.
Surface d'API
Utilisez le composable SearchBar pour implémenter des barres de recherche. Les paramètres clés de ce composable sont les suivants :
inputField: définit le champ de saisie de la barre de recherche. Il utilise généralementSearchBarDefaults.InputField, qui permet de personnaliser les éléments suivants :query: texte de la requête à afficher dans le champ de saisie.onQueryChange: lambda pour gérer les modifications de la chaîne de requête.
expanded: valeur booléenne indiquant si la barre de recherche est développée pour afficher des suggestions ou des résultats filtrés.onExpandedChange: lambda pour gérer les modifications de l'état développé du menu déroulant.content: contenu de cette barre de recherche pour afficher les résultats de recherche sousinputField.
Barre de recherche avec suggestions
Cet extrait montre une implémentation de base de SearchBar avec des suggestions :
@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() ) } } } } }
Points clés concernant le code
rememberSaveablegarantit que l'état développé ou réduit de la barre de recherche est conservé lors des modifications de configuration. Elle écrit la valeur mémorisée dans le bundlesavedInstanceStatede l'activité d'hébergement avant que l'activité ne soit détruite lors d'une modification de configuration.- Le modificateur
semanticscontrôle l'ordre de balayage de TalkBack.isTraversalGroupest défini pourBoxafin de regrouper tous ses composables enfants.traversalIndexest défini pour spécifier l'ordre dans lequel TalkBack lit les informations d'accessibilité de chaque pair du groupe. TalkBack lit les informations d'accessibilité d'un pair ayant une valeur négative, comme-1, avant un pair ayant une valeur positive, comme1. La valeur étant un float, vous pouvez spécifier un ordre personnalisé pour de nombreux pairs en définissant des valeurs comprises entre-1.0et1.0sur chaque pair.
SearchBarcontient uninputFieldpour la saisie utilisateur et unColumnpour afficher les suggestions de recherche.SearchBarDefaults.InputFieldcrée le champ de saisie et gère les modifications apportées à la requête utilisateur.onQueryChangegère la saisie de texte et met à jour l'état chaque fois que le texte du champ de saisie change.- L'état
expandedcontrôle la visibilité de la liste de suggestions.
searchResults.forEach { result -> … }effectue une itération dans la listesearchResultset crée unListItempour chaque résultat.- Lorsque l'utilisateur clique sur un
ListItem, letextFieldStateest mis à jour, la barre de recherche est réduite et letextFieldest rempli avec le résultat de recherche sélectionné.
- Lorsque l'utilisateur clique sur un
Résultat
Barre de recherche avec liste filtrée
Cet exemple montre un SearchBar qui filtre une liste en fonction de la requête de recherche de l'utilisateur :
@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) ) } } } } }
Points clés concernant le code
- La fonction lambda
onQueryChangeest appelée chaque fois que l'utilisateur saisit ou supprime du texte dans la barre de recherche. SearchBarDefaults.InputFieldcontient unleadingIcon, qui ajoute une icône de recherche au début du champ de saisie, et untrailingIcon, qui ajoute une icône "Plus d'options" à la fin du champ de saisie. Ici, vous pouvez proposer des options de tri et de filtrage à l'utilisateur.onSearch = { … }appelle le lambdaonSearchet réduit la barre de recherche lorsque la recherche est envoyée.- Un
LazyColumngère efficacement un nombre potentiellement élevé de résultats de recherche. Il parcourt la listesearchResultset affiche chaque résultat sous la forme d'unListItem. - Chaque composable
ListItemaffiche le texte de l'élément, un texte contenant des informations supplémentaires et une icône en forme d'étoile commeleadingContentde l'élément. Dans cet exemple, une option permettant d'ajouter l'élément aux favoris est présentée. - Pour connaître la logique de filtrage, consultez
CustomizableSearchBarExampledans le code source complet sur GitHub.
Résultat
Ressources supplémentaires
- Material Design : Barre de recherche