खोजने की सुविधा लागू करने के लिए, खोज बार का इस्तेमाल करें. खोज बार, एक ऐसा खोज फ़ील्ड है जो हमेशा दिखता रहता है. इसमें उपयोगकर्ता, कीवर्ड या वाक्यांश डालकर आपके ऐप्लिकेशन में काम के नतीजे देख सकते हैं. हमारा सुझाव है कि अगर आपके ऐप्लिकेशन का मुख्य फ़ोकस खोज करना है, तो खोज बार का इस्तेमाल करें.
एपीआई सरफ़ेस
खोज बार लागू करने के लिए, SearchBar कंपोज़ेबल का इस्तेमाल करें. इस कंपोज़ेबल के मुख्य पैरामीटर में ये शामिल हैं:
inputField: इससे खोज बार के इनपुट फ़ील्ड के बारे में पता चलता है. आम तौर पर, इसमेंSearchBarDefaults.InputFieldका इस्तेमाल किया जाता है. इसकी मदद से, इन्हें पसंद के मुताबिक बनाया जा सकता है:query: इनपुट फ़ील्ड में दिखाया जाने वाला क्वेरी टेक्स्ट.onQueryChange: क्वेरी स्ट्रिंग में होने वाले बदलावों को मैनेज करने के लिए Lambda.
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: @Compos>able (() - Unit)? = { Icon(Icons.Default.Search, contentDescription = "Search") }, trailingIco>n: @Composable (() - Unit)? = null, supportingContent: (@C>omposable (String) - Unit)? = null, leadingConten>t: (@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 = searchRes>ults.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) ) } } }SearchBar.kt
कोड के बारे में अहम बातें
- जब भी उपयोगकर्ता खोज बार में टेक्स्ट टाइप करता है या मिटाता है, तब
onQueryChangeलैम्डा फ़ंक्शन को कॉल किया जाता है. SearchBarDefaults.InputFieldमें एकleadingIconशामिल है, जो इनपुट फ़ील्ड की शुरुआत में खोज आइकॉन जोड़ता है. साथ ही, इसमें एकtrailingIconशामिल है, जो इनपुट फ़ील्ड के आखिर में "ज़्यादा विकल्प" आइकॉन जोड़ता है. यहां उपयोगकर्ता को क्रम से लगाने और फ़िल्टर करने के विकल्प दिए जा सकते हैं.onSearch = { … },onSearchलैम्ब्डा को कॉल करता है और खोज सबमिट होने पर खोज बार को छोटा कर देता है.LazyColumn, खोज के नतीजों की बड़ी संख्या को बेहतर तरीके से मैनेज करता है. यहsearchResultsसूची में मौजूद हर आइटम पर कार्रवाई को दोहराता है और हर नतीजे कोListItemके तौर पर दिखाता है.- हर
ListItemकंपोज़ेबल, आइटम का टेक्स्ट, ज़्यादा जानकारी दिखाने वाला टेक्स्ट, और आइटम केleadingContentके तौर पर स्टार आइकॉन दिखाता है. इस उदाहरण में, आइटम को पसंदीदा के तौर पर मार्क करने का विकल्प दिखाया गया है. - फ़िल्टर करने के लॉजिक के लिए, GitHub पर मौजूद पूरे सोर्स कोड में
CustomizableSearchBarExampleदेखें.
नतीजा
अन्य संसाधन
- मटीरियल डिज़ाइन: खोज बार