सर्च इंटरफ़ेस बनाना

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

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

खोज डायलॉग और विजेट के लिए उपलब्ध अन्य सुविधाओं में ये शामिल हैं:

  • बोलकर खोजें
  • हाल ही की क्वेरी के आधार पर खोज के सुझाव
  • खोज के ऐसे सुझाव जो आपके ऐप्लिकेशन के डेटा में मौजूद असल नतीजों से मेल खाते हों

इस दस्तावेज़ में, अपने ऐप्लिकेशन को सेट अप करने का तरीका बताया गया है. इससे आपको एक ऐसा सर्च इंटरफ़ेस मिलेगा जिसमें Android सिस्टम, खोज क्वेरी देने में आपकी मदद करेगा. इसके लिए, सर्च डायलॉग या सर्च विजेट का इस्तेमाल किया जा सकता है.

इसी विषय से जुड़े लिंक:

बुनियादी बातें

शुरू करने से पहले, तय करें कि आपको खोज के लिए इंटरफ़ेस, खोज वाले डायलॉग या खोज वाले विजेट का इस्तेमाल करके लागू करना है. ये दोनों ही प्लैटफ़ॉर्म, खोज से जुड़ी एक जैसी सुविधाएं देते हैं. हालांकि, इन्हें इस्तेमाल करने का तरीका थोड़ा अलग होता है:

  • खोज डायलॉग एक यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट है. इसे Android सिस्टम कंट्रोल करता है. उपयोगकर्ता के इस सुविधा को चालू करने पर, खोज वाला डायलॉग बॉक्स, गतिविधि के सबसे ऊपर दिखता है.

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

  • खोज विजेट, SearchView का एक इंस्टेंस है. इसे लेआउट में कहीं भी रखा जा सकता है. डिफ़ॉल्ट रूप से, खोज करने वाला विजेट एक स्टैंडर्ड EditText विजेट की तरह काम करता है और कुछ नहीं करता. हालांकि, इसे इस तरह कॉन्फ़िगर किया जा सकता है कि Android सिस्टम, सभी इनपुट इवेंट को हैंडल करे, क्वेरी को सही गतिविधि तक पहुंचाए, और खोज के सुझाव दे. यह खोज करने वाले डायलॉग की तरह ही काम करता है.

जब उपयोगकर्ता, खोज डायलॉग या खोज विजेट से कोई खोज करता है, तो सिस्टम एक Intent बनाता है और उसमें उपयोगकर्ता की क्वेरी सेव करता है. इसके बाद, सिस्टम उस गतिविधि को शुरू करता है जिसे आपने खोजों को मैनेज करने के लिए तय किया है. इसे "खोजे जा सकने वाले गतिविधि" कहा जाता है. साथ ही, यह गतिविधि इंटेंट को डिलीवर करती है. इस तरह की खोज के लिए, आपको अपने ऐप्लिकेशन को सेट अप करना होगा. इसके लिए, आपको इन चीज़ों की ज़रूरत होगी:

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

इस दस्तावेज़ के बाकी हिस्से में, खोज कॉन्फ़िगरेशन और खोजे जा सकने वाले डेटा को बनाने का तरीका बताया गया है. साथ ही, इसमें खोज डायलॉग या खोज विजेट की मदद से, खोज इंटरफ़ेस को लागू करने का तरीका भी बताया गया है.

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

इसके लिए, आपको खोज कॉन्फ़िगरेशन नाम की एक एक्सएमएल फ़ाइल की ज़रूरत होगी. यह कुकी, खोज वाले डायलॉग बॉक्स या विजेट के यूज़र इंटरफ़ेस (यूआई) के कुछ पहलुओं को कॉन्फ़िगर करती है. साथ ही, यह तय करती है कि सुझाव और वॉइस सर्च जैसी सुविधाएं कैसे काम करती हैं. इस फ़ाइल का नाम आम तौर पर searchable.xml होता है. इसे res/xml/ प्रोजेक्ट डायरेक्ट्री में सेव करना ज़रूरी है.

खोज कॉन्फ़िगरेशन फ़ाइल में, <searchable> एलिमेंट को रूट नोड के तौर पर शामिल करना ज़रूरी है. साथ ही, इसमें एक या उससे ज़्यादा एट्रिब्यूट तय करने होंगे. जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>

सिर्फ़ android:label एट्रिब्यूट की वैल्यू देना ज़रूरी है. यह स्ट्रिंग रिसॉर्स की ओर इशारा करता है, जो ऐप्लिकेशन का नाम होना चाहिए. जब तक क्विक सर्च बॉक्स के लिए खोज के सुझाव देने की सुविधा चालू नहीं की जाती, तब तक यह लेबल उपयोगकर्ता को नहीं दिखता. इस सुविधा को चालू करने के बाद, यह लेबल सिस्टम सेटिंग में, खोजे जा सकने वाले आइटम की सूची में दिखता है.

हालांकि, इसकी ज़रूरत नहीं है, लेकिन हमारा सुझाव है कि आप हमेशा android:hint एट्रिब्यूट को शामिल करें. इससे उपयोगकर्ताओं को खोज बॉक्स में क्वेरी डालने से पहले, एक हिंट स्ट्रिंग मिलती है. यह हिंट इसलिए ज़रूरी है, क्योंकि इससे लोगों को यह पता चलता है कि वे क्या खोज सकते हैं.

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

खोजे जा सकने वाली गतिविधि बनाना

खोजे जा सकने वाले कॉम्पोनेंट, आपके ऐप्लिकेशन में मौजूद Activity होते हैं. ये क्वेरी स्ट्रिंग के आधार पर खोज करते हैं और खोज के नतीजे दिखाते हैं.

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

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

खोजे जा सकने वाली गतिविधि का एलान करना

अगर आपके पास पहले से कोई ऐसा Activity नहीं है जो खोज करता हो और नतीजे दिखाता हो, तो एक Activity बनाएं. आपको अभी खोज की सुविधा लागू करने की ज़रूरत नहीं है. बस एक ऐसी गतिविधि बनाएं जिसे मेनिफ़ेस्ट में शामिल किया जा सके. मेनिफ़ेस्ट के <activity> एलिमेंट में, ये काम करें:

  1. <intent-filter> एलिमेंट में ACTION_SEARCH इंटेंट को स्वीकार करने के लिए, गतिविधि का एलान करें.
  2. <meta-data> एलिमेंट में इस्तेमाल किए जाने वाले खोज कॉन्फ़िगरेशन के बारे में बताएं.

इसे यहां दिए गए उदाहरण में दिखाया गया है:

<application ... >
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>

<meta-data> एलिमेंट में, android:name एट्रिब्यूट शामिल होना चाहिए. इसकी वैल्यू "android.app.searchable" होनी चाहिए. साथ ही, इसमें android:resource एट्रिब्यूट शामिल होना चाहिए. इसकी वैल्यू, खोजे जा सकने वाले कॉन्फ़िगरेशन फ़ाइल का रेफ़रंस होनी चाहिए. ऊपर दिए गए उदाहरण में, इसका मतलब res/xml/searchable.xml फ़ाइल से है.

खोज करना

मेनिफ़ेस्ट में खोजे जा सकने वाली गतिविधि के बारे में बताने के बाद, खोजे जा सकने वाली गतिविधि में खोज करने के लिए, यह तरीका अपनाएं:

  1. क्वेरी पाना.
  2. अपना डेटा खोजें.
  3. नतीजे पेश करें.

क्वेरी पाना

जब कोई उपयोगकर्ता खोज डायलॉग या विजेट से खोज करता है, तो सिस्टम आपकी खोज की जा सकने वाली गतिविधि शुरू करता है और उसे ACTION_SEARCH इंटेंट भेजता है. इस इंटेंट में, QUERY स्ट्रिंग एक्स्ट्रा में खोज क्वेरी शामिल होती है. गतिविधि शुरू होने पर, इस इंटेंट की जांच करें और स्ट्रिंग निकालें. उदाहरण के लिए, खोजे जा सकने वाले डेटा से जुड़ी गतिविधि शुरू होने पर, खोज क्वेरी पाने का तरीका यहां बताया गया है:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.search)

    // Verify the action and get the query.
    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doMySearch(query)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action, and get the query.
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

QUERY स्ट्रिंग, ACTION_SEARCH इंटेंट के साथ हमेशा शामिल होती है. ऊपर दिए गए उदाहरण में, क्वेरी को वापस पाया जाता है और इसे लोकल doMySearch() तरीके से पास किया जाता है. यहां खोज की असली कार्रवाई की जाती है.

अपना डेटा खोजना

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

  • अगर आपका डेटा डिवाइस पर SQLite डेटाबेस में सेव है, तो टेक्स्ट डेटा में ज़्यादा बेहतर तरीके से खोजने के लिए, फ़ुल-टेक्स्ट सर्च का इस्तेमाल करें. इसके लिए, LIKE क्वेरी के बजाय FTS3 का इस्तेमाल करें. इससे आपको ज़्यादा तेज़ी से नतीजे मिल सकते हैं. Android पर SQLite के बारे में जानकारी के लिए, SQLiteDatabase क्लास और FTS3 के बारे में जानकारी के लिए, sqlite.org पर जाएं.
  • अगर आपका डेटा ऑनलाइन सेव किया गया है, तो हो सकता है कि उपयोगकर्ता के डेटा कनेक्शन की वजह से, खोज की परफ़ॉर्मेंस पर असर पड़े. खोज के नतीजे दिखने तक, प्रोग्रेस इंडिकेटर दिखाया जा सकता है. नेटवर्क एपीआई के रेफ़रंस के लिए, android.net देखें. साथ ही, प्रोग्रेस इंडिकेटर दिखाने के तरीके के बारे में जानकारी के लिए, ProgressBar देखें.

नतीजे दिखाना

आपका डेटा कहां सेव है और उसे कैसे खोजा जाता है, इससे कोई फ़र्क़ नहीं पड़ता. हमारा सुझाव है कि आप खोजे जा सकने वाले डेटा से जुड़े खोज नतीजों को Adapter के साथ दिखाएं. इस तरह, खोज के सभी नतीजों को RecyclerView में दिखाया जा सकता है. अगर आपका डेटा, SQLite डेटाबेस क्वेरी से आता है, तो अपने नतीजों को RecyclerView पर लागू किया जा सकता है. इसके लिए, CursorAdapter का इस्तेमाल करें. अगर आपका डेटा किसी दूसरे फ़ॉर्मैट में है, तो BaseAdapter का एक्सटेंशन बनाया जा सकता है.

Adapter, डेटा के सेट में मौजूद हर आइटम को View ऑब्जेक्ट में बाइंड करता है. जब Adapter को RecyclerView पर लागू किया जाता है, तो डेटा का हर हिस्सा सूची में अलग-अलग व्यू के तौर पर डाला जाता है. Adapter सिर्फ़ एक इंटरफ़ेस है. इसलिए, CursorAdapter जैसे इंप्लिमेंटेशन की ज़रूरत होती है. इसका इस्तेमाल Cursor से डेटा बाइंड करने के लिए किया जाता है. अगर मौजूदा लागू करने के तरीकों में से कोई भी तरीका आपके डेटा के लिए काम नहीं करता है, तो BaseAdapter से अपना तरीका लागू किया जा सकता है.

सर्च डायलॉग का इस्तेमाल करना

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

डिफ़ॉल्ट रूप से, खोज वाला डायलॉग हमेशा छिपा रहता है. उपयोगकर्ता के इसे चालू करने पर ही यह दिखता है. आपका ऐप्लिकेशन, onSearchRequested() को कॉल करके खोज डायलॉग को चालू कर सकता है. हालांकि, यह तरीका तब तक काम नहीं करता, जब तक गतिविधि के लिए खोज डायलॉग चालू नहीं किया जाता.

खोज डायलॉग को खोज करने की अनुमति देने के लिए, सिस्टम को यह बताएं कि खोज डायलॉग से कौनसी खोज क्वेरी मिलनी चाहिए. उदाहरण के लिए, खोजे जा सकने वाले गतिविधि टैग बनाने के बारे में ऊपर दिए गए सेक्शन में, SearchableActivity नाम की खोजे जा सकने वाली गतिविधि बनाई गई है. अगर आपको खोज डायलॉग दिखाने और OtherActivity को खोज के नतीजे देने के लिए, OtherActivity नाम की कोई अलग गतिविधि चाहिए, तो मेनिफ़ेस्ट में यह एलान करें कि OtherActivity, खोज डायलॉग के लिए इस्तेमाल की जाने वाली खोज गतिविधि है.SearchableActivitySearchableActivity

किसी गतिविधि के खोज डायलॉग के लिए, खोजे जा सकने वाले कॉन्टेंट का एलान करने के लिए, उस गतिविधि के <activity> एलिमेंट में <meta-data> एलिमेंट जोड़ें. <meta-data> एलिमेंट में, android:value एट्रिब्यूट शामिल होना चाहिए. यह एट्रिब्यूट, खोजे जा सकने वाले गतिविधि के क्लास का नाम तय करता है. साथ ही, इसमें android:name एट्रिब्यूट शामिल होना चाहिए, जिसकी वैल्यू "android.app.default_searchable" हो.

उदाहरण के लिए, यहां खोजे जा सकने वाले ऐप्लिकेशन SearchableActivity और खोजे न जा सकने वाले ऐप्लिकेशन OtherActivity, दोनों के लिए घोषणा दी गई है. OtherActivity, खोज के लिए SearchableActivity का इस्तेमाल करता है. इससे खोज के डायलॉग से की गई खोजों को पूरा किया जा सकता है:

<application ... >
    <!-- This is the searchable activity; it performs searches. -->
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>

    <!-- This activity enables the search dialog to initiate searches
         in the SearchableActivity. -->
    <activity android:name=".OtherActivity" ... >
        <!-- Enable the search dialog to send searches to SearchableActivity. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" />
    </activity>
    ...
</application>

OtherActivity में अब <meta-data> एलिमेंट शामिल है. इससे यह तय किया जा सकता है कि खोज के लिए, खोजे जा सकने वाली कौनसी गतिविधि का इस्तेमाल करना है. इस गतिविधि से, खोज डायलॉग चालू हो जाता है. उपयोगकर्ता इस गतिविधि में शामिल है. हालांकि, onSearchRequested() तरीके से खोज डायलॉग चालू होता है. जब उपयोगकर्ता खोज करता है, तो सिस्टम SearchableActivity शुरू करता है और उसे ACTION_SEARCH इंटेंट डिलीवर करता है.

अगर आपको अपने ऐप्लिकेशन में हर गतिविधि के लिए, खोज वाला डायलॉग बॉक्स दिखाना है, तो हर <activity> के बजाय, ऊपर दिए गए <meta-data> एलिमेंट को <application> एलिमेंट के चाइल्ड के तौर पर डालें. इस तरह, हर गतिविधि को वैल्यू मिलती है, खोज डायलॉग उपलब्ध होता है, और खोजों को एक ही खोजे जा सकने वाली गतिविधि पर डिलीवर किया जाता है. अगर आपके पास खोजे जा सकने वाली एक से ज़्यादा गतिविधियां हैं, तो अलग-अलग गतिविधियों में <meta-data> का दूसरा एलान करके, खोजे जा सकने वाली डिफ़ॉल्ट गतिविधि को बदला जा सकता है.

आपकी गतिविधियों के लिए, खोज वाला डायलॉग बॉक्स अब चालू हो गया है. इसलिए, आपका ऐप्लिकेशन खोज करने के लिए तैयार है.

खोज वाला डायलॉग बॉक्स खोलना

कुछ डिवाइसों में, खोज के लिए अलग से बटन दिया जाता है. हालांकि, अलग-अलग डिवाइसों में इस बटन का काम करने का तरीका अलग-अलग हो सकता है. साथ ही, कई डिवाइसों में खोज के लिए बटन नहीं दिया जाता. इसलिए, खोज डायलॉग का इस्तेमाल करते समय, आपको अपने यूज़र इंटरफ़ेस (यूआई) में एक खोज बटन देना होगा. यह बटन, onSearchRequested() को कॉल करके खोज डायलॉग को चालू करता है.

उदाहरण के लिए, अपने विकल्प मेन्यू या यूज़र इंटरफ़ेस (यूआई) लेआउट में खोज बटन जोड़ें, जो onSearchRequested() को कॉल करता हो.

आपके पास "टाइप करके खोजें" सुविधा को चालू करने का विकल्प भी होता है. इससे, उपयोगकर्ता के कीबोर्ड पर टाइप करना शुरू करने पर, खोज डायलॉग चालू हो जाता है. कीस्ट्रोक, खोज डायलॉग में डाले जाते हैं. गतिविधि के दौरान, setDefaultKeyMode—या DEFAULT_KEYS_SEARCH_LOCAL—को कॉल करके, गतिविधि में टाइप करके खोजने की सुविधा चालू की जा सकती है. इसके लिए, गतिविधि के onCreate() तरीके का इस्तेमाल करें.

खोज डायलॉग का आपकी गतिविधि के लाइफ़साइकल पर असर

खोज डायलॉग, स्क्रीन पर सबसे ऊपर दिखने वाला Dialog होता है. इससे ऐक्टिविटी स्टैक में कोई बदलाव नहीं होता. इसलिए, जब खोज वाला डायलॉग दिखता है, तब लाइफ़साइकल के कोई भी तरीके, जैसे कि onPause() को कॉल नहीं किया जाता. आपकी गतिविधि से इनपुट फ़ोकस हट जाता है, क्योंकि इनपुट फ़ोकस, खोज वाले डायलॉग को दिया जाता है.

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

Kotlin

override fun onSearchRequested(): Boolean {
    pauseSomeStuff()
    return super.onSearchRequested()
}

Java

@Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}

अगर उपयोगकर्ता, 'वापस जाएं' बटन पर टैप करके खोज रद्द करता है, तो खोज वाला डायलॉग बंद हो जाता है और गतिविधि को इनपुट फ़ोकस वापस मिल जाता है. सर्च डायलॉग बॉक्स को setOnDismissListener(), setOnCancelListener() या दोनों के साथ बंद होने पर सूचना पाने के लिए रजिस्टर किया जा सकता है. आपको सिर्फ़ OnDismissListener को रजिस्टर करना होगा, क्योंकि सर्च डायलॉग बॉक्स बंद होने पर इसे हर बार कॉल किया जाता है. OnCancelListener सिर्फ़ उन इवेंट से जुड़ा होता है जिनमें उपयोगकर्ता, खोज डायलॉग से बाहर निकलता है. इसलिए, खोज किए जाने पर इसे कॉल नहीं किया जाता है. खोज पूरी होने पर, खोज वाला डायलॉग अपने-आप बंद हो जाता है.

अगर मौजूदा गतिविधि, खोजे जा सकने वाली गतिविधि नहीं है, तो उपयोगकर्ता के खोज करने पर, गतिविधि के लाइफ़साइकल के सामान्य इवेंट ट्रिगर होते हैं. मौजूदा गतिविधि को onPause() मिलता है. इसके बारे में गतिविधियों के बारे में जानकारी में बताया गया है. हालांकि, अगर मौजूदा गतिविधि खोजे जा सकने वाली गतिविधि है, तो इनमें से कोई एक काम होता है:

  • डिफ़ॉल्ट रूप से, खोजे जा सकने वाले ऐप्लिकेशन को ACTION_SEARCH इंटेंट मिलता है. साथ ही, onCreate() को कॉल किया जाता है. इसके अलावा, ऐक्टिविटी का नया इंस्टेंस, ऐक्टिविटी स्टैक के सबसे ऊपर लाया जाता है. अब गतिविधि स्टैक में, खोजे जा सकने वाले कॉन्टेंट की दो गतिविधियां मौजूद हैं. इसलिए, 'वापस जाएं' बटन पर टैप करने से, खोजे जा सकने वाले कॉन्टेंट की पिछली गतिविधि पर वापस जाया जा सकता है. इससे खोजे जा सकने वाले कॉन्टेंट की गतिविधि बंद नहीं होती.
  • अगर आपने android:launchMode को "singleTop" पर सेट किया है, तो खोजे जा सकने वाले ऐप्लिकेशन को ACTION_SEARCH इंटेंट मिलता है. साथ ही, onNewIntent(Intent) को कॉल किया जाता है. इससे नया ACTION_SEARCH इंटेंट पास होता है. उदाहरण के लिए, यहां बताया गया है कि इस मामले को कैसे हैंडल किया जा सकता है. इसमें खोजे जा सकने वाले ऐप्लिकेशन की गतिविधि का लॉन्च मोड "singleTop" है:

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.search)
        handleIntent(intent)
    }
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }
    
    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            intent.getStringExtra(SearchManager.QUERY)?.also { query ->
                doMySearch(query)
            }
        }
    }

    Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        handleIntent(getIntent());
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }
    
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    खोज करने के बारे में जानकारी देने वाले सेक्शन में दिए गए उदाहरण कोड की तुलना में, खोज के इरादे को हैंडल करने वाला पूरा कोड अब handleIntent() तरीके में है, ताकि onCreate() और onNewIntent(), दोनों इसे लागू कर सकें.

    जब सिस्टम onNewIntent(Intent) को कॉल करता है, तब गतिविधि फिर से शुरू नहीं होती. इसलिए, getIntent() मैथड वही इंटेंट दिखाता है जो onCreate() के साथ मिला था. इसलिए, आपको setIntent(Intent) को onNewIntent(Intent) के अंदर कॉल करना होगा, ताकि गतिविधि से सेव किया गया इंटेंट अपडेट हो जाए. ऐसा तब होगा, जब आपने आने वाले समय में getIntent() को कॉल किया हो.

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

<activity android:name=".SearchableActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
          android:name="android.app.searchable"
          android:resource="@xml/searchable"/>
  </activity>

खोज के कॉन्टेक्स्ट का डेटा पास करना

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

इस तरह के डेटा को खोजे जा सकने वाली गतिविधि में पास करने के लिए, उस गतिविधि के लिए onSearchRequested() तरीके को बदलें जिसमें उपयोगकर्ता खोज कर सकता है. इसके बाद, अतिरिक्त डेटा के साथ Bundle बनाएं और खोज डायलॉग को चालू करने के लिए startSearch() को कॉल करें. उदाहरण के लिए:

Kotlin

override fun onSearchRequested(): Boolean {
    val appData = Bundle().apply {
        putBoolean(JARGON, true)
    }
    startSearch(null, false, appData, false)
    return true
}

Java

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

सही वैल्यू का मतलब है कि आपने इस कॉलबैक इवेंट को मैनेज कर लिया है. साथ ही, खोज डायलॉग को चालू करने के लिए startSearch() को कॉल किया है. जब कोई उपयोगकर्ता क्वेरी सबमिट करता है, तो उसे आपकी खोजे जा सकने वाली गतिविधि के साथ-साथ आपके जोड़े गए डेटा पर भी लागू किया जाता है. खोज को बेहतर बनाने के लिए, APP_DATA Bundle से अतिरिक्त डेटा निकाला जा सकता है. इसका उदाहरण यहां दिया गया है:

Kotlin

val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false

Java

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}

Search विजेट का इस्तेमाल करना

इस इमेज में, ऐप्लिकेशन के सबसे ऊपर मौजूद बार में खोज व्यू दिखाया गया है

पहली इमेज. ऐप्लिकेशन बार में, SearchViewविजेट को ऐक्शन व्यू के तौर पर दिखाया गया है.

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

Search विजेट को कॉन्फ़िगर करना

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

SearchManager पर getSearchableInfo() को कॉल करके, SearchableInfo का रेफ़रंस पाया जा सकता है.

उदाहरण के लिए, अगर ऐप्लिकेशन बार में ऐक्शन व्यू के तौर पर SearchView का इस्तेमाल किया जा रहा है, तो SearchView कॉलबैक के दौरान विजेट चालू करें. ऐसा इस उदाहरण में दिखाया गया है:onCreateOptionsMenu()

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the options menu from XML.
    val inflater = menuInflater
    inflater.inflate(R.menu.options_menu, menu)

    // Get the SearchView and set the searchable configuration.
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.menu_search).actionView as SearchView).apply {
        // Assumes current activity is the searchable activity.
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default.
    }

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration.
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default.

    return true;
}

अब खोज विजेट कॉन्फ़िगर हो गया है. साथ ही, सिस्टम खोज क्वेरी को आपकी खोजे जा सकने वाली गतिविधि पर डिलीवर करता है. सर्च विजेट के लिए, खोज के सुझाव भी चालू किए जा सकते हैं.

ऐप्लिकेशन बार में ऐक्शन व्यू के बारे में ज़्यादा जानने के लिए, ऐक्शन व्यू और ऐक्शन उपलब्ध कराने वाली कंपनी का इस्तेमाल करना लेख पढ़ें.

Search विजेट की अन्य सुविधाएं

SearchView विजेट में कुछ अतिरिक्त सुविधाएं मिलती हैं. इनका इस्तेमाल किया जा सकता है:

सबमिट बटन
डिफ़ॉल्ट रूप से, खोज क्वेरी सबमिट करने के लिए कोई बटन नहीं होता. इसलिए, उपयोगकर्ता को खोज शुरू करने के लिए कीबोर्ड पर Return कुंजी दबानी पड़ती है. setSubmitButtonEnabled(true) को कॉल करके, "सबमिट करें" बटन जोड़ा जा सकता है.
खोज से जुड़े सुझावों के लिए क्वेरी को बेहतर बनाना
खोज के सुझाव देने की सुविधा चालू करने पर, आम तौर पर आपको उम्मीद होती है कि उपयोगकर्ता कोई सुझाव चुनेंगे. हालांकि, वे सुझाई गई खोज क्वेरी को बेहतर बनाना भी चाहें. हर सुझाव के साथ एक बटन जोड़ा जा सकता है. इससे उपयोगकर्ता को setQueryRefinementEnabled(true) को कॉल करके, खोज बॉक्स में सुझाव डालने की सुविधा मिलती है.
खोज बॉक्स के दिखने की सेटिंग को टॉगल करने की सुविधा
डिफ़ॉल्ट रूप से, खोज विजेट को "आइकॉन के तौर पर दिखाया जाता है." इसका मतलब है कि इसे सिर्फ़ खोज आइकॉन—मैग्नीफ़ाइंग ग्लास के तौर पर दिखाया जाता है. जब उपयोगकर्ता इस आइकॉन पर टैप करता है, तो यह बड़ा हो जाता है और खोज बॉक्स दिखता है. ऊपर दिए गए उदाहरण में दिखाया गया है कि setIconifiedByDefault(false) को कॉल करके, खोज बॉक्स को डिफ़ॉल्ट रूप से दिखाया जा सकता है. setIconified() को कॉल करके, खोज विजेट के दिखने की सुविधा को टॉगल भी किया जा सकता है.

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

विजेट और डायलॉग, दोनों का इस्तेमाल करना

अगर आपने ऐप्लिकेशन बार में खोज विजेट को ऐक्शन व्यू के तौर पर डाला है और आपने इसे ऐप्लिकेशन बार में दिखने के लिए चालू किया है, तो हो सकता है कि खोज विजेट ऐक्शन व्यू के तौर पर न दिखे. इसके लिए, आपको android:showAsAction="ifRoom" सेट करना होगा. इसके बजाय, मेन्यू आइटम ओवरफ़्लो मेन्यू में दिख सकता है. उदाहरण के लिए, जब आपका ऐप्लिकेशन छोटी स्क्रीन पर चलता है, तो हो सकता है कि ऐप्लिकेशन बार में, खोज विजेट को अन्य कार्रवाई आइटम या नेविगेशन एलिमेंट के साथ दिखाने के लिए, ज़रूरत के मुताबिक जगह न हो. इसलिए, मेन्यू आइटम ओवरफ़्लो मेन्यू में दिखता है. ओवरफ़्लो मेन्यू में रखने पर, यह आइटम सामान्य मेन्यू आइटम की तरह काम करता है. साथ ही, इसमें ऐक्शन व्यू यानी खोज करने वाला विजेट नहीं दिखता.

इस स्थिति को मैनेज करने के लिए, आपको खोज विजेट को उस मेन्यू आइटम से जोड़ना होगा जो उपयोगकर्ता के ओवरफ़्लो मेन्यू से चुनने पर, खोज डायलॉग को चालू करता है. इसके लिए, "खोजें" मेन्यू आइटम को हैंडल करने के लिए onOptionsItemSelected() लागू करें. साथ ही, onSearchRequested() को कॉल करके खोज डायलॉग बॉक्स खोलें.

ऐप्लिकेशन बार में मौजूद आइटम के काम करने के तरीके और इस समस्या को हल करने के तरीके के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन बार जोड़ना लेख पढ़ें.

वॉइस सर्च की सुविधा जोड़ना

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

इसे यहां दिए गए उदाहरण में दिखाया गया है:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>

बोलकर खोजने की सुविधा चालू करने के लिए, showVoiceSearchButton वैल्यू ज़रूरी है. दूसरी वैल्यू, launchRecognizer, यह तय करती है कि वॉइस सर्च बटन को एक recognizer लॉन्च करना होगा. यह recognizer, खोजे जा सकने वाले टेक्स्ट को ट्रांसक्रिप्ट किए गए टेक्स्ट के तौर पर दिखाता है.

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

खोज से जुड़े सुझाव जोड़ना

Android सिस्टम की मदद से, खोज के लिए उपलब्ध डायलॉग और विजेट, दोनों में उपयोगकर्ता के टाइप करते समय खोज के सुझाव दिए जा सकते हैं. सिस्टम, सुझावों की सूची को मैनेज करता है. साथ ही, जब उपयोगकर्ता कोई सुझाव चुनता है, तब सिस्टम उस इवेंट को हैंडल करता है.

खोज के लिए दो तरह के सुझाव दिए जा सकते हैं:

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