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 wykorzystujeSearchBarDefaults.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: treść tego paska wyszukiwania, aby wyświetlać wyniki wyszukiwania poniżejinputField.
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ść w pakieciesavedInstanceStateaktywności hosta, zanim aktywność zostanie zniszczona podczas zmiany konfiguracji.- Klawisz modyfikujący
semanticskontroluje kolejność przechodzenia w TalkBack.isTraversalGroupjest ustawiony naBox, aby zgrupować wszystkie elementy kompozycyjne podrzędne.traversalIndexokreśla kolejność, w jakiej TalkBack odczytuje informacje o ułatwieniach dostępu od każdego elementu w grupie. TalkBack odczytuje informacje o ułatwieniach dostępu na urządzeniu równorzędnym z wartością ujemną, np.-1, przed urządzeniem równorzędnym z wartością dodatnią, 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 tekst w polu do wprowadzania danych ulegnie zmianie.- Stan
expandedokreśla widoczność listy sugestii.
searchResults.forEach { result -> … }wykonuje iteracjęsearchResultslisty i tworzyListItemdla każdego wyniku.- Gdy użytkownik kliknie
ListItem,textFieldStatezostanie zaktualizowany, pasek wyszukiwania zostanie zwinięty, atextFieldzostanie wypełniony wybranym wynikiem wyszukiwania.
- Gdy użytkownik kliknie
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.InputFieldzawieraleadingIcon, który dodaje ikonę wyszukiwania na początku pola do wprowadzania danych, oraztrailingIcon, 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. Iteruje listęsearchResultsi 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