Aby zaimplementować funkcję wyszukiwania, użyj paska wyszukiwania. Pasek wyszukiwania to trwałe pole wyszukiwania, które umożliwia użytkownikom wpisywanie słów kluczowych lub wyrażeń w celu wyświetlenia odpowiednich wyników w aplikacji. Polecane jest, gdy wyszukiwanie jest głównym celem aplikacji.

Interfejs API
Aby zaimplementować paski wyszukiwania, użyj komponentu SearchBar
. Kluczowe parametry tej usługi:
inputField
: określa pole wprowadzania na pasku wyszukiwania. Zwykle wykorzystuje ona bibliotekęSearchBarDefaults.InputField
, która umożliwia dostosowanie:query
: tekst zapytania, który ma być wyświetlany w polu tekstowym.onQueryChange
: funkcja Lambda do obsługi zmian w składniku zapytania.
expanded
: wartość logiczna wskazująca, czy pasek wyszukiwania jest rozwinięty, aby wyświetlać sugestie czy wyniki po filtrowaniu.onExpandedChange
: funkcja Lambda do obsługi zmian w rozwiniętym stanie menu.content
: treść tego paska wyszukiwania, która ma się wyświetlać pod elementeminputField
.
Pasek wyszukiwania z sugestiami
Ten fragment kodu pokazuje podstawową implementację 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
rememberSaveable
zapewnia, że stan paska wyszukiwania (rozwinięty lub zwinięty) jest zachowany po zmianach konfiguracji. Zapisują zapamiętaną wartość w pakieciesavedInstanceState
hostowanej aktywności, zanim zostanie ona zniszczona podczas zmiany konfiguracji.- Modyfikator
semantics
określa kolejność przeszukiwania TalkBack.isTraversalGroup
jest ustawiony dlaBox
, aby pogrupować wszystkie jego komponenty podrzędne.traversalIndex
jest ustawiony w celu określenia kolejności, w jakiej TalkBack odczytuje informacje o dostępności z poszczególnych urządzeń w grupie. TalkBack odczytuje informacje o dostępności na urządzeniu peera o ujemnej wartości, np.-1
, przed urządzeniem o dodatkowej wartości, np.1
. Ponieważ wartość jest typu float, możesz określić niestandardową kolejność wielu węzłów, ustawiając wartości między-1.0
a1.0
na każdym z nich.
- Element
SearchBar
zawiera poleinputField
do wpisywania danych przez użytkownika oraz poleColumn
do wyświetlania sugestii wyszukiwania.SearchBarDefaults.InputField
tworzy pole wprowadzania danych i obsługuje zmiany w zapytaniu użytkownika.onQueryChange
obsługuje tekst wprowadzany przez użytkownika i aktualizuje stan, gdy tylko tekst w polu tekstowym ulegnie zmianie.- Stan
The expanded
określa widoczność listy sugestii.
searchResults.forEach { result -> … }
iteruje po liściesearchResults
i tworzyListItem
dla każdego wyniku.- Po kliknięciu
ListItem
poletextFieldState
zostanie zaktualizowane, pasek wyszukiwania zostanie zwinięta, a poletextField
wypełni się wybranym wynikiem wyszukiwania.
- Po kliknięciu
Wynik

Pasek wyszukiwania z filtrowaną listą
Ten przykład pokazuje element 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, // 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) ) } } } } }
Najważniejsze informacje o kodzie
- Funkcja lambda
onQueryChange
jest wywoływana, gdy użytkownik wpisze lub skasuje tekst na pasku wyszukiwania. SearchBarDefaults.InputField
zawieraleadingIcon
, który dodaje ikonę wyszukiwania na początku pola tekstowego, oraztrailingIcon
, który dodaje ikonę „więcej opcji” na końcu pola tekstowego. Możesz tu udostępnić użytkownikowi opcje sortowania i filtrowania.- Funkcja
onSearch = { … }
wywołuje funkcję lambdaonSearch
i zwija pasek wyszukiwania po przesłaniu wyszukiwania. LazyColumn
obsługuje efektywnie potencjalnie dużą liczbę wyników wyszukiwania. Przechodzi przez listęsearchResults
i wyświetla każdy wynik jakoListItem
.- Każdy komponent
ListItem
zawiera tekst elementu, tekst z dodatkowymi informacjami oraz ikonę gwiazdki jakoleadingContent
elementu. W tym przykładzie wyświetla się opcja dodania produktu do ulubionych. - Logika filtrowania znajduje się w
CustomizableSearchBarExample
w pełnym kodzie źródłowym na GitHubie.
Wynik

Dodatkowe materiały
- Material Design: pasek wyszukiwania