खोज बार

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

दो खोज बार दिखते हैं. बाईं ओर मौजूद फ़ील्ड में सिर्फ़ टेक्स्ट होता है.
  बाईं ओर मौजूद खोज बार में एक टेक्स्ट फ़ील्ड है और उसके नीचे खोज का सुझाव है.
पहली इमेज. सामान्य खोज बार (1) और सुझाव वाला खोज बार (2).

एपीआई का प्लैटफ़ॉर्म

खोज बार लागू करने के लिए, 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 में चुने गए खोज नतीजे की जानकारी भर जाती है.

नतीजा

खोज बार में &#39;a&#39; अक्षर टाइप किया गया है. खोज बार के नीचे, खोज के छह सुझावों की सूची दिखती है.
दूसरी इमेज. सुझावों के साथ खोज बार दिखाया गया है.

फ़िल्टर की गई सूची वाला खोज बार

इस उदाहरण में एक 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 देखें.

नतीजा

खोज बार में, टेक्स्ट खोजने के लिए सुझाए गए शब्द दिख रहे हैं. खोज बार के नीचे, खोज के सुझावों की सूची दिखती है. हर सुझाव के बगल में स्टार का आइकॉन होता है.
तीसरी इमेज. काम के सुझावों के साथ खोज बार दिखाया गया है.

अन्य संसाधन