खोज की सुविधा लागू करने के लिए, खोज बार का इस्तेमाल करें. खोज बार एक ऐसा खोज फ़ील्ड होता है जो हमेशा मौजूद रहता है. इसकी मदद से, उपयोगकर्ता आपके ऐप्लिकेशन में काम के नतीजे देखने के लिए कोई कीवर्ड या फ़्रेज़ डाल सकते हैं. हमारा सुझाव है कि अगर आपके ऐप्लिकेशन का मुख्य फ़ोकस खोज है, तो खोज बार का इस्तेमाल करें.

एपीआई का प्लैटफ़ॉर्म
खोज बार लागू करने के लिए, SearchBar
कॉम्पोज़ेबल का इस्तेमाल करें. इस कॉम्पोज़ेबल के मुख्य पैरामीटर में ये शामिल हैं:
inputField
: खोज बार के इनपुट फ़ील्ड के बारे में बताता है. आम तौर पर, इसमेंSearchBarDefaults.InputField
का इस्तेमाल किया जाता है. इसकी मदद से, इन चीज़ों को पसंद के मुताबिक बनाया जा सकता है:query
: इनपुट फ़ील्ड में दिखने वाला क्वेरी टेक्स्ट.onQueryChange
: क्वेरी स्ट्रिंग में हुए बदलावों को मैनेज करने के लिए, Lambda फ़ंक्शन.
expanded
: यह एक बूलियन वैल्यू है. इससे पता चलता है कि सुझाव दिखाने या फ़िल्टर किए गए नतीजे दिखाने के लिए, खोज बार को बड़ा किया गया है या नहीं.onExpandedChange
: ड्रॉपडाउन के बड़े किए गए स्टेटस में होने वाले बदलावों को मैनेज करने के लिए, Lambda फ़ंक्शन.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, ग्रुप के हर पीयर से ऐक्सेसibilit TalkBack,1
जैसी पॉज़िटिव वैल्यू वाले पीयर के बजाय,-1
जैसी नेगेटिव वैल्यू वाले पीयर की सुलभता से जुड़ी जानकारी पहले पढ़ता है. वैल्यू फ़्लोट होती है. इसलिए, हर पीयर के लिए-1.0
से1.0
के बीच वैल्यू सेट करके, कई पीयर का कस्टम क्रम तय किया जा सकता है.
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, // 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) ) } } } } }
कोड के बारे में अहम जानकारी
- जब भी कोई उपयोगकर्ता खोज बार में टेक्स्ट टाइप करता है या मिटाता है, तब
onQueryChange
lambda फ़ंक्शन को कॉल किया जाता है. SearchBarDefaults.InputField
में एकleadingIcon
होता है, जो इनपुट फ़ील्ड की शुरुआत में खोज आइकॉन जोड़ता है. साथ ही, इसमें एकtrailingIcon
होता है, जो इनपुट फ़ील्ड के आखिर में "ज़्यादा विकल्प" आइकॉन जोड़ता है. यहां उपयोगकर्ता को, क्रम से लगाने और फ़िल्टर करने के विकल्प दिए जा सकते हैं.onSearch = { … }
,onSearch
लैम्ब्डा को कॉल करता है और खोज सबमिट होने पर, खोज बार को छोटा कर देता है.LazyColumn
, खोज के नतीजों की बड़ी संख्या को बेहतर तरीके से मैनेज करता है. यहsearchResults
सूची में मौजूद हर नतीजे कोListItem
के तौर पर दिखाता है.- हर
ListItem
कंपोज़ेबल, आइटम का टेक्स्ट, ज़्यादा जानकारी दिखाने वाला टेक्स्ट, और आइटम केleadingContent
के तौर पर स्टार आइकॉन दिखाता है. इस उदाहरण में, आइटम को पसंदीदा के तौर पर सेट करने का विकल्प दिखाया गया है. - फ़िल्टर करने के लॉजिक के लिए, GitHub पर मौजूद पूरे सोर्स कोड में
CustomizableSearchBarExample
देखें.
नतीजा

अन्य संसाधन
- Material Design: Search bar