सर्च इंटरफ़ेस सेट अप करना

Compose को आज़माएं
Jetpack Compose, Android के लिए यूज़र इंटरफ़ेस (यूआई) टूलकिट है. हमारा सुझाव है कि इसका इस्तेमाल किया जाए. Compose में खोज की सुविधा जोड़ने का तरीका जानें.

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

ऐप्लिकेशन बार में SearchView जोड़ना

ऐप्लिकेशन बार में SearchView विजेट जोड़ने के लिए, अपने प्रोजेक्ट में res/menu/options_menu.xml नाम की फ़ाइल बनाएं और उसमें यह कोड जोड़ें. इस कोड से यह तय होता है कि खोज का आइटम कैसे बनाया जाए. जैसे, इस्तेमाल किया जाने वाला आइकॉन और आइटम का टाइटल. collapseActionView एट्रिब्यूट की मदद से, आपका SearchView पूरे ऐप्लिकेशन बार पर फ़ैल सकता है. साथ ही, इस्तेमाल में न होने पर, यह वापस सामान्य ऐप्लिकेशन बार आइटम में कोलैप्स हो सकता है. हैंडसेट डिवाइसों पर ऐप्लिकेशन बार के लिए सीमित जगह होने की वजह से, हमारा सुझाव है कि बेहतर उपयोगकर्ता अनुभव देने के लिए, collapsibleActionView एट्रिब्यूट का इस्तेमाल करें.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

अगर आपको खोज के लिए ज़्यादा ऐक्सेसिबल आइकॉन चाहिए, तो /res/drawable फ़ोल्डर में ic_search.xml फ़ाइल बनाएं और उसमें यह कोड शामिल करें:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

ऐप्लिकेशन बार में SearchView दिखाने के लिए, अपनी ऐक्टिविटी के onCreateOptionsMenu() तरीके में, एक्सएमएल मेन्यू रिसॉर्स res/menu/options_menu.xml को इन्फ़्लेट करें:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

ऐप्लिकेशन चलाने पर, कुछ ऐसा दिखता है:

ऐप्लिकेशन के सबसे ऊपर मौजूद बार में, खोज आइकॉन के साथ खाली स्क्रीन दिखाने वाली इमेज
पहली इमेज. ऐप्लिकेशन के सबसे ऊपर मौजूद बार में, खोज का आइकॉन.

SearchView, आपके ऐप्लिकेशन के ऐप्लिकेशन बार में दिखता है, लेकिन यह काम नहीं करता. खोज के आइकॉन पर टैप करने पर, कुछ ऐसा दिखता है:

इस इमेज में, खोज के नतीजों में दिखने वाले विज्ञापन को दिखाया गया है
दूसरी इमेज. कार्रवाई में SearchView.

SearchView को काम करने लायक बनाने के लिए, आपको यह तय करना होगा कि SearchView कैसे काम करे.

खोज का कॉन्फ़िगरेशन बनाना

खोज का search कॉन्फ़िगरेशन, यह तय करता है कि SearchView कैसे काम करे. इसे res/xml/searchable.xml फ़ाइल में तय किया जाता है. खोज के कॉन्फ़िगरेशन में कम से कम एक android:label एट्रिब्यूट होना चाहिए. इसकी वैल्यू, आपके Android मेनिफ़ेस्ट में <application> या <activity> एलिमेंट के android:label एट्रिब्यूट की वैल्यू के बराबर होनी चाहिए. हालांकि, हमारा सुझाव है कि android:hint एट्रिब्यूट भी जोड़ा जाए, ताकि उपयोगकर्ता को यह पता चल सके कि खोज बॉक्स में क्या डालना है.

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, <meta-data> एलिमेंट तय करें. यह एलिमेंट, res/xml/searchable.xml फ़ाइल की ओर इशारा करता है. उस एलिमेंट को उस <activity> में तय करें जिसमें आपको SearchView दिखाना है.

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

आपके बनाए गए onCreateOptionsMenu() तरीके में, setSearchableInfo(SearchableInfo) को कॉल करके, खोज के कॉन्फ़िगरेशन को SearchView से जोड़ें:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

को कॉल करने पर, getSearchableInfo() ऑब्जेक्ट मिलता है. SearchableInfo यह ऑब्जेक्ट, खोज के कॉन्फ़िगरेशन की एक्सएमएल फ़ाइल से बनाया जाता है. जब खोज का कॉन्फ़िगरेशन, आपके SearchView से सही तरीके से जुड़ जाता है और उपयोगकर्ता कोई क्वेरी सबमिट करता है, तो SearchView, ACTION_SEARCH इंटेंट के साथ एक ऐक्टिविटी शुरू करता है. इसके बाद, आपको ऐसी ऐक्टिविटी की ज़रूरत होती है जो इस इंटेंट के लिए फ़िल्टर कर सके और खोज की क्वेरी को हैंडल कर सके.

खोज की सुविधा वाली ऐक्टिविटी बनाना

खोज की सुविधा वाली ऐक्टिविटी, ACTION_SEARCH इंटेंट के लिए फ़िल्टर करती है और डेटा सेट में क्वेरी खोजती है. खोज की सुविधा वाली ऐक्टिविटी बनाने के लिए, अपनी पसंद की कोई ऐक्टिविटी तय करें, ताकि वह ACTION_SEARCH इंटेंट के लिए फ़िल्टर कर सके:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

खोज की सुविधा वाली ऐक्टिविटी में, onCreate() तरीके में इसकी जांच करके, ACTION_SEARCH इंटेंट को हैंडल करें.

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

अब SearchView, उपयोगकर्ता की क्वेरी स्वीकार कर सकता है और ACTION_SEARCH इंटेंट के साथ, खोज की सुविधा वाली ऐक्टिविटी शुरू कर सकता है.

खोज की क्वेरी पाने के बाद, इसे ViewModel में पास किया जा सकता है. यहां इसका इस्तेमाल, खोज के नतीजे पाने और उन्हें दिखाने के लिए, अपने आर्किटेक्चर की अन्य लेयर में किया जा सकता है.