Użyj paska wyszukiwania, aby zaimplementować funkcję wyszukiwania. Pasek wyszukiwania to stałe pole wyszukiwania, w którym użytkownicy mogą wpisać słowo kluczowe lub wyrażenie, aby wyświetlić trafne wyniki w aplikacji. Jest on zalecany, gdy wyszukiwanie jest głównym celem aplikacji.
Powierzchnia interfejsu API
Użyj komponentu SearchBar, aby zaimplementować paski wyszukiwania. Kluczowe parametry tego komponentu to:
inputField: Definiuje pole do wprowadzania danych na pasku wyszukiwania. Zwykle wykorzystuje onaSearchBarDefaults.InputField, co umożliwia dostosowanie:query: tekst zapytania, który ma się wyświetlać w polu do wprowadzania danych.onQueryChange: funkcja Lambda do obsługi zmian w ciągu zapytania.
expanded: wartość logiczna wskazująca, czy pasek wyszukiwania jest rozwinięty, aby wyświetlać sugestie lub odfiltrowane wyniki.onExpandedChange: funkcja Lambda do obsługi zmian stanu rozwinięcia menu.content: zawartość tego paska wyszukiwania, aby wyświetlać wyniki wyszukiwania poniżej elementuinputField.
Pasek wyszukiwania z sugestiami
Ten fragment kodu pokazuje podstawowe wdrożenie SearchBar z sugestiami:
@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() ) } } } } }
Najważniejsze informacje o kodzie
rememberSaveablezapewnia, że stan paska wyszukiwania (rozwinięty lub zwinięty) jest zachowywany po zmianach konfiguracji. Zapisuje zapamiętaną wartość wsavedInstanceStatepakiecie aktywności hosta, zanim aktywność zostanie zniszczona podczas zmiany konfiguracji.- Klawisz modyfikujący
semanticskontroluje kolejność przechodzenia w TalkBack.isTraversalGroupjest ustawiony naBox, aby grupować wszystkie elementy kompozycyjne podrzędne.traversalIndexokreśla kolejność, w jakiej TalkBack odczytuje informacje o ułatwieniach dostępu z każdego elementu w grupie. TalkBack odczytuje informacje o ułatwieniach dostępu na urządzeniu o wartości ujemnej, np.-1, przed urządzeniem o wartości dodatniej, np.1. Ponieważ wartość jest liczbą zmiennoprzecinkową, możesz określić niestandardową kolejność wielu elementów równorzędnych, ustawiając wartości między-1.0a1.0dla każdego z nich.
- Element
SearchBarzawierainputFielddo wprowadzania danych wejściowych użytkownika iColumndo wyświetlania sugestii wyszukiwania.SearchBarDefaults.InputFieldtworzy pole do wprowadzania danych i obsługuje zmiany w zapytaniu użytkownika.onQueryChangeobsługuje wprowadzanie tekstu i aktualizuje stan, gdy tylko zmieni się tekst w polu do wprowadzania danych.- Stan
expandedokreśla widoczność listy sugestii.
searchResults.forEach { result -> … }wykonuje iteracjęsearchResultslisty i tworzyListItemdla każdego wyniku.- Kliknięcie ikony
ListItempowoduje zaktualizowanie ikonytextFieldState, zwinięcie paska wyszukiwania i wypełnienie ikonytextFieldwybranym wynikiem wyszukiwania.
- Kliknięcie ikony
Wynik
Pasek wyszukiwania z filtrowaną listą
Ten przykład pokazuje SearchBar, który filtruje listę na podstawie zapytania użytkownika:
@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) ) } } } } }
Najważniejsze informacje o kodzie
- Funkcja lambda
onQueryChangejest wywoływana za każdym razem, gdy użytkownik wpisze lub usunie tekst na pasku wyszukiwania. SearchBarDefaults.InputFieldzawiera elementleadingIcon, który dodaje ikonę wyszukiwania na początku pola do wprowadzania danych, oraz elementtrailingIcon, który dodaje ikonę „więcej opcji” na końcu pola do wprowadzania danych. W tym miejscu możesz udostępnić użytkownikowi opcje sortowania i filtrowania.onSearch = { … }wywołuje funkcję lambdaonSearchi zwija pasek wyszukiwania po przesłaniu wyszukiwania.LazyColumnskutecznie obsługuje potencjalnie dużą liczbę wyników wyszukiwania. Wykonuje iterację listysearchResultsi wyświetla każdy wynik jakoListItem.- Każdy komponent
ListItemzawiera tekst elementu, tekst z dodatkowymi informacjami i ikonę gwiazdki jakoleadingContentelementu. W tym przykładzie wyświetla się opcja dodania produktu do ulubionych. - Logikę filtrowania znajdziesz w
CustomizableSearchBarExamplew pełnym kodzie źródłowym na GitHubie.
Wynik
Dodatkowe materiały
- Material Design: pasek wyszukiwania