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

'लिखें' सुविधा आज़माएं
Android के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर सुझाया जाता है. 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 कैसे काम करता है.

सर्च कॉन्फ़िगरेशन बनाना

सर्च कॉन्फ़िगरेशन से यह पता चलता है कि 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" />

अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, res/xml/searchable.xml फ़ाइल पर ले जाने वाले <meta-data> एलिमेंट का एलान करें. उस <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>

खोजी जा सकने वाली गतिविधि में, ACTION_SEARCH इंटेंट को मैनेज करने के लिए, अपने onCreate() तरीके में इसकी जांच करें.

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 को पास किया जा सकता है. यहां, इसे अपने आर्किटेक्चर की अन्य लेयर में इस्तेमाल करके, खोज के नतीजे दिखाए जा सकते हैं.