खोज से जुड़े कस्टम सुझाव जोड़ें

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

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

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

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

पहली इमेज. हाल ही की क्वेरी के सुझावों के साथ, खोज डायलॉग का स्क्रीनशॉट.

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

हाल ही की क्वेरी के सुझाव देने के लिए, आपको यह करना होगा:

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

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

जब सिस्टम को पता चलता है कि आपकी गतिविधि को खोजा जा सकता है और वह खोज के सुझाव देता है, तो उपयोगकर्ता के क्वेरी टाइप करने पर यह होता है:

  1. सिस्टम, सर्च क्वेरी के टेक्स्ट को लेता है. यह टेक्स्ट, उपयोगकर्ता के टाइप किए गए टेक्स्ट के आधार पर होता है. इसके बाद, सिस्टम कॉन्टेंट उपलब्ध कराने वाली कंपनी को क्वेरी भेजता है. इस क्वेरी में आपके सुझाव शामिल होते हैं.
  2. कॉन्टेंट उपलब्ध कराने वाली कंपनी, आपको एक Cursor दिखाती है. इसमें खोज क्वेरी के टेक्स्ट से मेल खाने वाले सभी सुझाव होते हैं.
  3. सिस्टम, Cursor के दिए गए सुझावों की सूची दिखाता है.

हाल ही की क्वेरी के सुझाव दिखने के बाद, ऐसा हो सकता है:

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

कॉन्टेंट उपलब्ध कराने वाली कंपनी के लिए, एक्सटेंड की गई SearchRecentSuggestionsProvider क्लास, ऊपर दिए गए चरणों में अपने-आप काम करती है. इसलिए, आपको बहुत कम कोड लिखना पड़ता है.

कॉन्टेंट देने वाली कंपनी बनाना

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

उदाहरण के लिए, हाल ही में की गई क्वेरी के सुझावों के लिए, कॉन्टेंट प्रोवाइडर को पूरी तरह से लागू करने का तरीका यहां दिया गया है:

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

Java

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}

setupSuggestions() को कॉल करने पर, सर्च अथॉरिटी का नाम और डेटाबेस मोड पास किया जाता है. खोज के लिए अनुमति देने वाली इकाई कोई भी यूनीक स्ट्रिंग हो सकती है. हालांकि, सबसे सही तरीका यह है कि कॉन्टेंट उपलब्ध कराने वाली इकाई के लिए पूरी तरह से क्वालिफ़ाइड नाम का इस्तेमाल किया जाए. जैसे, पैकेज का नाम और उसके बाद कॉन्टेंट उपलब्ध कराने वाली इकाई की क्लास का नाम. उदाहरण के लिए, "com.example.MySuggestionProvider".

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

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

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

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

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

सिस्टम को सुझाव देने वाली सेवा का इस्तेमाल करने के लिए कॉन्फ़िगर करने के लिए, खोजे जा सकने वाले कॉन्फ़िगरेशन फ़ाइल में मौजूद <searchable> एलिमेंट में android:searchSuggestAuthority और android:searchSuggestSelection एट्रिब्यूट जोड़ें. उदाहरण के लिए:

<?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"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

android:searchSuggestAuthority की वैल्यू, कॉन्टेंट उपलब्ध कराने वाली कंपनी का पूरा नाम होना चाहिए. यह नाम, कॉन्टेंट उपलब्ध कराने वाली कंपनी में इस्तेमाल किए गए नाम से पूरी तरह मेल खाना चाहिए. जैसे, ऊपर दिए गए उदाहरणों में "com.example.MySuggestionProvider".

android:searchSuggestSelection की वैल्यू, एक सवालिया निशान होनी चाहिए. इससे पहले एक स्पेस होना चाहिए: " ?". यह SQLite के सिलेक्शन आर्ग्युमेंट के लिए प्लेसहोल्डर है. इसे उपयोगकर्ता की ओर से डाले गए क्वेरी टेक्स्ट से अपने-आप बदल दिया जाता है.

क्वेरी सेव करना

हाल की क्वेरी के कलेक्शन को भरने के लिए, खोजे जा सकने वाले डेटा से मिली हर क्वेरी को अपने SearchRecentSuggestionsProvider में जोड़ें. इसके लिए, SearchRecentSuggestions का एक इंस्टेंस बनाएं और जब भी आपकी खोजे जा सकने वाली गतिविधि को कोई क्वेरी मिलती है, तब saveRecentQuery() को कॉल करें. उदाहरण के लिए, यहां बताया गया है कि गतिविधि के दौरान क्वेरी को कैसे सेव किया जा सकता है. इसके लिए, गतिविधि के onCreate() तरीके का इस्तेमाल करें:

Kotlin

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

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

Java

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

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

SearchRecentSuggestionsProvider कंस्ट्रक्टर को उसी अथॉरिटी और डेटाबेस मोड की ज़रूरत होती है जिसे कॉन्टेंट उपलब्ध कराने वाली कंपनी ने तय किया है.

saveRecentQuery() तरीके में, खोज क्वेरी स्ट्रिंग को पहले पैरामीटर के तौर पर लिया जाता है. साथ ही, सुझाव की दूसरी लाइन के तौर पर शामिल करने के लिए, दूसरी स्ट्रिंग या शून्य को दूसरे पैरामीटर के तौर पर लिया जाता है. दूसरे पैरामीटर का इस्तेमाल सिर्फ़ तब किया जाता है, जब आपने DATABASE_MODE_2LINES की मदद से खोज के सुझावों के लिए दो लाइन वाला मोड चालू किया हो. दो लाइन वाला मोड चालू करने पर, सिस्टम मिलते-जुलते सुझाव ढूंढते समय क्वेरी टेक्स्ट को दूसरी लाइन से मैच करता है.

सुझाव का डेटा मिटाना

उपयोगकर्ता की निजता को सुरक्षित रखने के लिए, उसे हाल ही के खोज क्वेरी के सुझावों को मिटाने का विकल्प हमेशा दें. क्वेरी का इतिहास मिटाने के लिए, clearHistory() को कॉल करें. उदाहरण के लिए:

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

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