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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

आपको सबसे पहले एक एक्सएमएल फ़ाइल की ज़रूरत होगी जिसे खोज कॉन्फ़िगरेशन. यह खोज डायलॉग या विजेट के कुछ यूज़र इंटरफ़ेस (यूआई) पहलुओं को कॉन्फ़िगर करती है और सुझाव और वॉइस सर्च का इस्तेमाल करने जैसी सुविधाएं. यह फ़ाइल पारंपरिक रूप से है 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 अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अतिरिक्त, आपके डेटा को खोजता है और नतीजे दिखाता है.

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

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

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

  1. ACTION_SEARCH इंटेंट को स्वीकार करने के लिए, गतिविधि का एलान करें <intent-filter> एलिमेंट.
  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 का इस्तेमाल करके पूरे टेक्स्ट की मदद से खोज करना क्वेरी—टेक्स्ट डेटा में ज़्यादा बेहतर खोज करने में मदद कर सकती है और तेज़ी से नतीजे दे सकते हैं. यहां जाएं: sqlite.org के लिए FTS3 और SQLiteDatabase Android पर SQLite के बारे में जानकारी के लिए क्लास.
  • अगर आपका डेटा ऑनलाइन सेव किया जाता है, तो अनुमानित खोज परफ़ॉर्मेंस उपयोगकर्ता के डेटा कनेक्शन की वजह से रुकावट न हो. अपनी ऑडियंस की जानकारी के आधार पर, प्रोग्रेस इंडिकेटर, जब तक कि आपकी खोज वापस नहीं दिखती. यहां जाएं: android.net अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है नेटवर्क एपीआई की जानकारी और ProgressBar प्रोग्रेस इंडिकेटर को दिखाने का तरीका जानें.

नतीजे प्रज़ेंट करें

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

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

खोज डायलॉग का इस्तेमाल करना

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

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

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

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

उदाहरण के लिए, यहां खोजी जा सकने वाली गतिविधि, दोनों के बारे में एलान किया गया है, SearchableActivity और एक अन्य गतिविधि, 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 डिलीवर करता है इंटेंट.

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

  • डिफ़ॉल्ट रूप से, खोजने योग्य गतिविधि को onCreate() को कॉल के साथ ACTION_SEARCH इंटेंट, और गतिविधि के एक नए इंस्टेंस को गतिविधि के सबसे ऊपर लाया जाता है. स्टैक. अब इसमें आपकी खोज योग्य गतिविधि के दो उदाहरण मौजूद हैं गतिविधि स्टैक की पहचान करने के लिए, 'वापस जाएं' बटन पर टैप करने से के बजाय, हर बार डाइग्नोस्टिक टूल का इस्तेमाल करने के बजाय, गतिविधि.
  • अगर 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 ऑब्जेक्ट पास करना जो आपके खोजने लायक कॉन्फ़िगरेशन.

आप इस नंबर पर कॉल करके, SearchableInfo का रेफ़रंस पा सकते हैं getSearchableInfo() तारीख SearchManager.

उदाहरण के लिए, अगर 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 सिस्टम की मदद से खोज क्वेरी और खोज सुझावों को प्रदर्शित करने के लिए किया जा सकता है.

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

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

इस स्थिति से निपटने के लिए, मेन्यू आइटम, जिसमें आप खोज विजेट को अटैच करते हैं जब उपयोगकर्ता ओवरफ़्लो मेन्यू से खोज डायलॉग बॉक्स को चुनता है, तो इस डायलॉग बॉक्स को चालू करना ज़रूरी है. इसके लिए, onOptionsItemSelected() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है "Search" को मैनेज करने के लिए और कॉल करके खोज डायलॉग बॉक्स खोलें 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 से पता चलता है कि बोलकर खोजने के बटन को एक पहचानकर्ता लॉन्च करना होगा, जो लेख में बदले गए टेक्स्ट को, खोजी जा सकने वाली गतिविधि में बदला गया.

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

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

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

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

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