Android के खोज डायलॉग या खोज विजेट में, हाल ही की खोज क्वेरी के आधार पर खोज के सुझाव दिए जा सकते हैं. उदाहरण के लिए, अगर कोई उपयोगकर्ता "पपी" क्वेरी करता है, तो वही क्वेरी दोबारा टाइप करने पर, वह सुझाव के तौर पर दिखती है. पहली इमेज में, हाल ही की क्वेरी के सुझावों के साथ खोज डायलॉग का एक उदाहरण दिखाया गया है.
शुरू करने से पहले, अपने ऐप्लिकेशन में सामान्य खोजों के लिए, खोज डायलॉग या खोज विजेट लागू करें. इसका तरीका जानने के लिए, खोज इंटरफ़ेस बनाना लेख पढ़ें.
बुनियादी बातें
पहली इमेज. हाल ही की क्वेरी के सुझावों के साथ खोज डायलॉग का स्क्रीनशॉट.
हाल ही की क्वेरी के सुझाव, सेव की गई खोजें होती हैं. जब उपयोगकर्ता कोई सुझाव चुनता है, तो खोज की जा सकने वाली आपकी गतिविधि को ACTION_SEARCH इंटेंट मिलता है. इसमें सुझाव, खोज क्वेरी के तौर पर होता है. आपकी खोज की जा सकने वाली गतिविधि, इसे पहले से ही हैंडल करती है.
हाल ही की क्वेरी के सुझाव देने के लिए, आपको यह करना होगा:
- खोज की जा सकने वाली गतिविधि लागू करें.
- ऐसा कॉन्टेंट प्रोवाइडर बनाएं जो
SearchRecentSuggestionsProviderको बढ़ाता हो. साथ ही, इसे अपने ऐप्लिकेशन के मेनिफ़ेस्ट में एलान करें. - खोज के सुझाव देने वाले कॉन्टेंट प्रोवाइडर की जानकारी के साथ, खोज की जा सकने वाली गतिविधि के कॉन्फ़िगरेशन में बदलाव करें.
- हर बार खोज करने पर, क्वेरी को अपने कॉन्टेंट प्रोवाइडर में सेव करें.
जिस तरह Android सिस्टम, खोज डायलॉग दिखाता है उसी तरह वह डायलॉग या खोज विजेट के नीचे, खोज के सुझाव दिखाता है. आपको वह सोर्स देना होता है जिससे सिस्टम, सुझावों को वापस पाता है.
जब सिस्टम को पता चलता है कि आपकी गतिविधि को खोजा जा सकता है और वह खोज के सुझाव देती है, तो उपयोगकर्ता की क्वेरी टाइप करने पर यह होता है:
- सिस्टम, खोज क्वेरी का टेक्स्ट लेता है. यह टेक्स्ट, उपयोगकर्ता जो भी टाइप करना शुरू करता है वह होता है. इसके बाद, वह आपके सुझावों वाले कॉन्टेंट प्रोवाइडर को क्वेरी करता है.
- आपका कॉन्टेंट प्रोवाइडर,
Cursorदिखाता है. यह कर्सर, खोज क्वेरी के टेक्स्ट से मेल खाने वाले सभी सुझावों की ओर इशारा करता है. - सिस्टम,
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() तरीके में, खोज क्वेरी की स्ट्रिंग को पहले पैरामीटर के तौर पर लिया जाता है. इसके अलावा, दूसरे पैरामीटर के तौर पर, दूसरी स्ट्रिंग को सुझाव की दूसरी लाइन के तौर पर शामिल किया जा सकता है या null को शामिल किया जा सकता है. दूसरे पैरामीटर का इस्तेमाल सिर्फ़ तब किया जाता है, जब DATABASE_MODE_2LINES के साथ खोज के सुझावों के लिए, दो लाइन वाला मोड चालू किया जाता है. अगर दो लाइन वाला मोड चालू किया जाता है, तो सिस्टम, मेल खाने वाले सुझावों को ढूंढते समय, क्वेरी टेक्स्ट को दूसरी लाइन से मैच करता है.
सुझावों का डेटा मिटाना
उपयोगकर्ता की निजता की सुरक्षा के लिए, हमेशा ऐसा तरीका उपलब्ध कराएं जिससे उपयोगकर्ता, हाल ही की क्वेरी के सुझावों को मिटा सके. क्वेरी का इतिहास मिटाने के लिए, clearHistory() को कॉल करें.
उदाहरण के लिए:
Kotlin
SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE) .clearHistory()
Java
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();
इसे "खोज इतिहास मिटाएं" मेन्यू आइटम, प्राथमिकता वाले आइटम या बटन में से किसी एक से एक्ज़ीक्यूट करें. यह पुष्टि करने के लिए कि उपयोगकर्ता को अपना खोज इतिहास मिटाना है, पुष्टि करने वाला डायलॉग बॉक्स उपलब्ध कराएं.