از نوار جستجو برای پیادهسازی عملکرد جستجو استفاده کنید. نوار جستجو فیلد جستجوی ثابتی است که به کاربران امکان میدهد کلیدواژه یا عبارتی را برای نمایش نتایج مرتبط در برنامه شما وارد کنند و زمانی توصیه میشود که جستجو تمرکز اصلی برنامه شما باشد.
سطح میانای برنامهسازی کاربردی
از ترکیبپذیر SearchBar برای پیادهسازی نوارهای جستجو استفاده کنید. پارامترهای کلیدی برای
این 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تضمین میکند که باز یا بسته بودن نوار جستجو در تغییرات پیکربندی حفظ شود. این تابع مقدار بهخاطر سپردهشده را در بستهsavedInstanceState«فعالیت» میزبان مینویسد، قبلاز اینکه «فعالیت» درطول تغییر پیکربندی ازبین برود.- توصیفگر
semanticsترتیب پیمایش TalkBack را کنترل میکند.isTraversalGroupبرایBoxتنظیم شده است تا همه ترکیبپذیرهای فرزندش را گروهبندی کند.traversalIndexبرای مشخص کردن ترتیبی تنظیم شده است که TalkBack اطلاعات دسترسپذیری را از هر گروه همتا میخواند. TalkBack اطلاعات دسترسپذیری را در همتایی با مقدار منفی، مثل-1، قبلاز همتایی با مقدار مثبت، مثل1، میخواند. چون مقدار شناور است، میتوانید با تنظیم مقادیر بین-1.0و1.0در هر همتا، ترتیب سفارشی برای همتاهای زیادی مشخص کنید.
SearchBarحاویinputFieldبرای ورودی کاربر وColumnبرای نمایش پیشنهادهای جستجو است.SearchBarDefaults.InputFieldفیلد ورودی را ایجاد میکند و تغییرات پرسمان کاربر را مدیریت میکند.onQueryChangeورودی نوشتار را مدیریت میکند و هرگاه نوشتار در فیلد ورودی تغییر کند، وضعیت را بهروز میکند.- وضعیت
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نمایش میدهد.- هر
ListItemترکیبپذیر نوشتار مورد، نوشتار نشاندهنده اطلاعات بیشتر، و نماد ستاره را بهعنوانleadingContentمورد نشان میدهد. در این مثال، گزینهای برای افزودن مورد به موارد دلخواه ارائه شده است. - برای منطق فیلتر کردن،
CustomizableSearchBarExampleرا در کد منبع کامل در GitHub ببینید.
نتیجه
منابع بیشتر
- طراحی مواد: نوار جستجو