Arama işlevini uygulamak için bir arama çubuğu kullanın. Arama çubuğu, kullanıcıların uygulamanızda alakalı sonuçlar görüntülemek için anahtar kelime veya kelime öbeği girmesine olanak tanıyan kalıcı bir arama alanıdır. Uygulamanızın birincil odak noktası arama olduğunda arama çubuğu kullanılması önerilir.

API yüzeyi
Arama çubuklarını uygulamak için SearchBar
bileşenini kullanın. Bu derlenebilir öğenin temel parametreleri şunlardır:
inputField
: Arama çubuğunun giriş alanını tanımlar. GenellikleSearchBarDefaults.InputField
'ü kullanır. Bu, aşağıdakilerin özelleştirilmesine olanak tanır:query
: Giriş alanında gösterilecek sorgu metni.onQueryChange
: Sorgu dizesindeki değişiklikleri işlemek için Lambda.
expanded
: Arama çubuğunun önerileri mi yoksa filtrelenmiş sonuçları mı gösterecek şekilde genişletilip genişletilmediğini belirten bir boole değeri.onExpandedChange
: Açılır menünün genişletilmiş durumundaki değişiklikleri işleyen Lambda.content
: Arama sonuçlarınıinputField
'un altında görüntülemek için bu arama çubuğunun içeriği.
Öneriler içeren arama çubuğu
Bu snippet'te, önerilerle birlikte SearchBar
'ün temel bir uygulaması gösterilmektedir:
@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ış olmasının yapılandırma değişikliklerinde korunmasını sağlar. Hatırlanan değeri, yapılandırma değişikliği sırasında etkinlik yok edilmeden önce barındıran etkinliğinsavedInstanceState
paketine yazar.semantics
değiştirici, TalkBack'in traversal sırasını kontrol eder.isTraversalGroup
,Box
'un tüm alt bileşenlerini gruplandırması için ayarlanmıştır.traversalIndex
, TalkBack'in her grup eşinden erişilebilirlik bilgilerini okuduğu sırayı belirtecek şekilde ayarlanır. TalkBack,1
gibi pozitif değere sahip bir eşlemeden önce-1
gibi negatif değere sahip bir eşle ilgili erişilebilirlik bilgilerini okur. Değer bir kayan nokta olduğundan, her eş için-1.0
ile1.0
arasında değerler ayarlayarak birçok eş için özel bir sipariş belirtebilirsiniz.
SearchBar
, kullanıcı girişi için birinputField
ve arama önerilerini görüntülemek için birColumn
içerir.SearchBarDefaults.InputField
, giriş alanını oluşturur ve kullanıcı sorgusunda yapılan değişiklikleri işler.onQueryChange
, metin girişini işler ve giriş alanındaki metin değiştiğinde durumu günceller.The expanded
durumu, öneri listesinin görünürlüğünü kontrol eder.
searchResults.forEach { result -> … }
,searchResults
listesinde iterasyon yapar ve her sonuç için birListItem
oluşturur.ListItem
tıklandığındatextFieldState
güncellenir, arama çubuğu daraltılır vetextField
seçili arama sonucuyla doldurulur.
Sonuç

Filtrelenmiş liste içeren arama çubuğu
Bu örnekte, kullanıcının arama sorgusuna göre bir listeyi filtreleyen bir SearchBar
gösterilmektedir:
@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) ) } } } } }
Kodla ilgili önemli noktalar
onQueryChange
lambda işlevi, kullanıcı arama çubuğuna metin yazdığında veya metin sildiğinde çağrılır.SearchBarDefaults.InputField
, giriş alanının başına bir arama simgesi ekleyen birleadingIcon
ve giriş alanının sonuna "diğer seçenekler" simgesi ekleyen birtrailingIcon
içerir. Burada kullanıcıya sıralama ve filtreleme seçenekleri sunabilirsiniz.onSearch = { … }
,onSearch
lambda işlevini çağırır ve arama gönderildiğinde arama çubuğunu daraltır.LazyColumn
, çok sayıda arama sonucunu verimli bir şekilde işler.searchResults
listesinde iterasyon yapar ve her sonucuListItem
olarak gösterir.- Her
ListItem
bileşeni, öğe metnini, ek bilgileri gösteren metni ve öğeninleadingContent
olarak bir yıldız simgesi gösterir. Bu örnekte, öğeyi favorilere ekleme seçeneği sunulmaktadır. - Filtreleme mantığı için GitHub'daki tam kaynak kodunda
CustomizableSearchBarExample
bölümüne bakın.
Sonuç

Ek kaynaklar
- Materyal Tasarım: Arama çubuğu