از نوار جستجو برای پیادهسازی قابلیت جستجو استفاده کنید. نوار جستجو یک فیلد جستجوی دائمی است که به کاربران اجازه میدهد یک کلمه کلیدی یا عبارت را وارد کنند تا نتایج مرتبط در برنامه شما نمایش داده شود و زمانی که جستجو تمرکز اصلی برنامه شماست، توصیه میشود.

سطح API
 از SearchBar composable برای پیادهسازی نوارهای جستجو استفاده کنید. پارامترهای کلیدی این composable شامل موارد زیر است:
-  
inputField: فیلد ورودی نوار جستجو را تعریف میکند. معمولاً ازSearchBarDefaults.InputFieldاستفاده میکند که امکان سفارشیسازی موارد زیر را فراهم میکند:-  
query: متن پرسوجویی که قرار است در فیلد ورودی نمایش داده شود. -  
onQueryChange: لامبدا برای مدیریت تغییرات در رشته پرسوجو. 
 -  
 -  
expanded: یک مقدار بولی که نشان میدهد نوار جستجو برای نمایش پیشنهادات یا نتایج فیلتر شده، باز شده است یا خیر. onExpandedChange: لامبدا برای مدیریت تغییرات در حالت باز شدهی منوی کشویی.content: محتوای این نوار جستجو برای نمایش نتایج جستجو در زیرinputField.
نوار جستجو با پیشنهادات
 این قطعه کد، پیادهسازی اولیهی SearchBar را به همراه پیشنهادات آن نشان میدهد: 
@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() ) } } } } }
نکات کلیدی در مورد کد
-  
rememberSaveableتضمین میکند که چه نوار جستجو باز شود و چه بسته، در طول تغییرات پیکربندی حفظ شود. این تابع مقدار به خاطر سپرده شده را قبل از اینکه Activity در طول تغییر پیکربندی از بین برود، در بستهsavedInstanceStateActivity میزبان مینویسد. -  اصلاحکنندهی 
semantics، ترتیب پیمایش TalkBack را کنترل میکند.-  
isTraversalGroupطوری تنظیم شده است کهBoxتمام کامپوننتهای فرزند خود را گروهبندی کند. -  
traversalIndexطوری تنظیم شده است که ترتیب خواندن اطلاعات دسترسی از هر گروه peer توسط TalkBack را مشخص کند. TalkBack اطلاعات دسترسی را روی یک peer با مقدار منفی، مانند-1، قبل از یک peer با مقدار مثبت، مانند1، میخواند. از آنجا که مقدار اعشاری است، میتوانید با تنظیم مقادیر بین-1.0و1.0در هر peer، ترتیب دلخواهی از چندین peer را مشخص کنید. 
 -  
 -  
SearchBarشامل یکinputFieldبرای ورودی کاربر و یکColumnبرای نمایش پیشنهادات جستجو است.-  
SearchBarDefaults.InputFieldفیلد ورودی را ایجاد میکند و تغییرات در پرسوجوی کاربر را مدیریت میکند. -  
onQueryChangeورودی متن را مدیریت میکند و هر زمان که متن در فیلد ورودی تغییر کند، وضعیت را بهروزرسانی میکند. -  حالت 
The expandedمیزان نمایش لیست پیشنهادات را کنترل میکند. 
 -  
 -  
searchResults.forEach { result -> … }در لیستsearchResultsجستجو میکند و برای هر نتیجه یکListItemایجاد میکند.-  وقتی روی یک 
ListItemکلیک میشود،textFieldStateبهروزرسانی میشود، نوار جستجو را جمع میکند وtextFieldبا نتیجه جستجوی انتخاب شده پر میکند. 
 -  وقتی روی یک 
 
نتیجه

نوار جستجو با لیست فیلتر شده
 این مثال یک SearchBar نشان میدهد که لیستی را بر اساس عبارت جستجوی کاربر فیلتر میکند: 
@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) ) } } } } }
نکات کلیدی در مورد کد
-  تابع لامبدا 
onQueryChangeهر زمان که کاربر متنی را در نوار جستجو تایپ یا حذف کند، فراخوانی میشود. -  
SearchBarDefaults.InputFieldشامل یکleadingIconاست که یک آیکون جستجو را به ابتدای فیلد ورودی اضافه میکند و یکtrailingIconکه یک آیکون "گزینههای بیشتر" را به انتهای فیلد ورودی اضافه میکند. در اینجا میتوانید گزینههای مرتبسازی و فیلتر کردن را در اختیار کاربر قرار دهید. -  
onSearch = { … }لامبداonSearchرا فراخوانی میکند و هنگام ارسال جستجو، نوار جستجو را جمع میکند. -  یک 
LazyColumnمیتواند تعداد زیادی از نتایج جستجو را به طور موثر مدیریت کند. این ستون در لیستsearchResultsپیمایش میکند و هر نتیجه را به عنوان یکListItemنمایش میدهد. -  هر 
ListItemcomposable متن آیتم، متنی که اطلاعات اضافی را نشان میدهد و یک آیکون ستاره به عنوانleadingContentآیتم را نشان میدهد. در این مثال، گزینهای برای افزودن آیتم به لیست علاقهمندیها ارائه شده است. -  برای منطق فیلترینگ، به 
CustomizableSearchBarExampleدر کد منبع کامل در GitHub مراجعه کنید. 
نتیجه

منابع اضافی
- طراحی متریال: نوار جستجو