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

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>

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

सिस्टम को सुझाव देने वाली सेवा का इस्तेमाल करने के लिए कॉन्फ़िगर करने के लिए, android:searchSuggestAuthority और android:searchSuggestSelection एट्रिब्यूट की वैल्यू सबमिट करें.<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"
    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();

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