Arama işlevini uygulamak için arama çubuğu kullanın. Arama çubuğu, kullanıcıların uygulamanızda alakalı sonuçları görüntülemek için bir anahtar kelime veya kelime öbeği girmesine olanak tanıyan kalıcı bir arama alanıdır. Uygulamanızın birincil odağı arama olduğunda kullanılması önerilir.
API yüzeyi
Arama çubukları uygulamak için SearchBar composable'ını kullanın. Bu composable'ın temel parametreleri şunlardır:
inputField: Arama çubuğunun giriş alanını tanımlar. GenellikleSearchBarDefaults.InputFieldkullanılır. Bu sayede şunlar özelleştirilebilir:query: Giriş alanında gösterilecek sorgu metni.onQueryChange: Sorgu dizesindeki değişiklikleri işlemek için Lambda.
expanded: Arama çubuğunun, önerileri veya filtrelenmiş sonuçları göstermek için genişletilip genişletilmediğini belirten bir boole değeri.onExpandedChange: Açılır listenin genişletilmiş durumundaki değişiklikleri işlemek için lambda.content: Bu arama çubuğunun içeriği, arama sonuçlarınıinputFieldaltında gösterir.
Öneriler içeren arama çubuğu
Bu snippet, önerilerle birlikte SearchBar'nin temel bir uygulamasını gösterir:
@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() ) } } } } }
Kodla ilgili önemli noktalar
rememberSaveable, arama çubuğunun genişletilmiş veya daraltılmış durumunun yapılandırma değişiklikleri boyunca korunmasını sağlar. Hatırlanan değeri, yapılandırma değişikliği sırasında etkinlik yok edilmeden önce barındırma etkinliğininsavedInstanceStatepaketine yazar.semanticsdeğiştiricisi, TalkBack gezinme sırasını kontrol eder.isTraversalGroup, tüm alt bileşenlerini gruplandırmak içinBoxolarak ayarlanır.traversalIndex, TalkBack'in her bir grup eşinden erişilebilirlik bilgilerini okuma sırasını belirtmek için ayarlanır. TalkBack,-1gibi negatif değere sahip bir eşle ilgili erişilebilirlik bilgilerini,1gibi pozitif değere sahip bir eşten önce okur. Değer bir kayan nokta olduğundan, her bir eş üzerinde-1.0ile1.0arasında değerler ayarlayarak birçok eş için özel bir sıra belirtebilirsiniz.
SearchBar, kullanıcı girişi için birinputFieldve arama önerilerini görüntülemek için birColumniçerir.SearchBarDefaults.InputField, giriş alanını oluşturur ve kullanıcı sorgusundaki değişiklikleri işler.onQueryChange, metin girişini işler ve giriş alanındaki metin her değiştiğinde durumu günceller.expandeddurumu, öneri listesinin görünürlüğünü kontrol eder.
searchResults.forEach { result -> … },searchResultslistesinde iterasyon yapar ve her sonuç için birListItemoluşturur.- Bir
ListItemtıklandığındatextFieldStategüncellenir, arama çubuğu daraltılır vetextFieldseçilen arama sonucuyla doldurulur.
- Bir
Sonuç
Filtrelenmiş liste içeren arama çubuğu
Bu örnekte, kullanıcının arama sorgusuna göre bir listeyi filtreleyen SearchBar gösterilmektedir:
@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) ) } } } } }
Kodla ilgili önemli noktalar
- Kullanıcı, arama çubuğuna metin yazdığında veya metin sildiğinde
onQueryChangelambda işlevi çağrılır. SearchBarDefaults.InputField, giriş alanının başına bir arama simgesi ekleyenleadingIconve giriş alanının sonuna "diğer seçenekler" simgesi ekleyentrailingIconiçerir. Burada kullanıcıya sıralama ve filtreleme seçenekleri sunabilirsiniz.onSearch = { … }, arama gönderildiğindeonSearchlambda'yı çağırır ve arama çubuğunu daraltır.LazyColumn, çok sayıda arama sonucunu verimli bir şekilde işler.searchResultslistesinde iterasyon yapar ve her sonucuListItemolarak gösterir.- Her
ListItemcomposable, öğe metnini, ek bilgileri gösteren metni ve öğeninleadingContentolarak bir yıldız simgesini gösterir. Bu örnekte, öğeyi favorilere ekleme seçeneği sunulmaktadır. - Filtreleme mantığı için GitHub'daki tam kaynak kodunda
CustomizableSearchBarExamplebölümüne bakın.
Sonuç
Ek kaynaklar
- Materyal Tasarım: Arama çubuğu