
यह एंड्रॉइड सर्च डायलॉग (पिछले वाले
यहां और
यहां हैं ) का उपयोग करने पर अंतिम लेख है। इसमें, मैं आपको बताऊंगा कि डायलॉग में डायनामिक सर्च हिंट को कैसे जोड़ा जाए, साथ ही सिस्टम क्विक सर्च बॉक्स (QSB) में अपने एप्लिकेशन में खोज को कैसे एकीकृत किया जाए। क्यूएसबी का लाभ यह है कि इसकी मदद से आप ओएस में लगभग कहीं से भी जानकारी प्राप्त कर सकते हैं।
सिद्धांत
आपके द्वारा खोजे जा रहे एप्लिकेशन में डेटा का उपयोग करके खोज संकेत बनाए जाते हैं। जब उपयोगकर्ता उनमें से एक का चयन करता है, तो खोज प्रबंधक गतिविधि को इरादे भेजता है, जो खोज के लिए जिम्मेदार है। आमतौर पर, जब उपयोगकर्ता संवाद में खोज आइकन पर क्लिक करता है, तो खोज का एक प्रकार भेजा जाता है, हालांकि, जब इस मामले में शीघ्रता का चयन करते हैं, तो आप एक अन्य प्रकार के इरादे को परिभाषित कर सकते हैं, ताकि हम इसे इंटरसेप्ट कर सकें और उचित कार्रवाई कर सकें, उदाहरण के लिए, एक नया संवाद बनाना, या कॉलिंग गतिविधि जानकारी प्रदर्शित करने के लिए, आदि।
खोज क्वेरी डेटा पहले की तरह इरादे से स्थानांतरित किया जाता है, लेकिन अब हम सामग्री प्रदाता के माध्यम से अनुरोध के प्रकार को निर्धारित करने के लिए यूआरआई का उपयोग करेंगे।
फिर से, हमें डायलॉग रेंडर करने के लिए कोई क्रिया करने की आवश्यकता नहीं है, यह सर्च मैनेजर द्वारा किया जाता है, जो कि हम सभी के लिए जरूरी है कि वह एक कॉन्फ़िगरेशन xml फ़ाइल सबमिट करे।
इसलिए, जब खोज प्रबंधक खोज के लिए जिम्मेदार और खोज के लिए संकेत प्रदान करने के लिए हमारी गतिविधि को परिभाषित करता है, तो क्रियाओं के निम्नलिखित अनुक्रम होते हैं:
- जब खोज प्रबंधक खोज क्वेरी का पाठ प्राप्त करता है, तो वह संकेत प्रदान करने वाले सामग्री प्रदाता को अपना अनुरोध भेजता है।
- सामग्री प्रदाता खोज क्वेरी के पाठ से मेल खाने वाले संकेत की ओर इशारा करते हुए एक कर्सर लौटाता है।
- खोज प्रबंधक कर्सर का उपयोग करके टूलटिप्स प्रदर्शित करता है
संकेतों की सूची प्रदर्शित होने के बाद, निम्नलिखित हो सकता है:
- यदि उपयोगकर्ता अनुरोध के पाठ को बदलता है, तो उपरोक्त सभी चरणों को दोहराया जाएगा।
- यदि उपयोगकर्ता खोज शुरू करता है, तो संकेतों को नजरअंदाज कर दिया जाता है, और गतिविधि के लिए खोज का एक प्रकार भेजा जाता है।
- यदि उपयोगकर्ता एक संकेत का चयन करता है, तो गतिविधि के रूप में एक अलग प्रकार की एक गतिविधि गतिविधि को वितरित की जाती है (प्रकार को कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया गया है), यूआरआई को डेटा के रूप में स्थानांतरित करता है। URI का उपयोग चयनित प्रॉम्प्ट के अनुरूप तालिका में रिकॉर्ड को खोजने के लिए किया जाएगा।
इसलिए, हम अपने आवेदन को संशोधित करते हैं (जो कि
भाग 1 में चर्चा की गई थी) ताकि गतिशील टूलटिप्स जोड़े जाएं, और, तंत्र को बाहर निकालने के लिए, टूलटिप चुनने पर, हम एक नई गतिविधि कहेंगे, जो अनुरोध पर जानकारी प्रदर्शित करेगी। कार्यान्वयन के लिए आपको आवश्यकता होगी:
- सामग्री प्रदाता और संकेत के लिए उपयोग किए जाने वाले प्रकार के बारे में जानकारी जोड़ने के लिए संवाद कॉन्फ़िगरेशन फ़ाइल बदलें
- SQLite डेटाबेस में एक तालिका बनाएँ जो संकेतों के लिए खोज प्रबंधक द्वारा आवश्यक कॉलम प्रदान करेगी
- संकेत तालिका तक पहुंच के साथ एक नया सामग्री प्रदाता बनाएं और इसे प्रकट में परिभाषित करें
- एक गतिविधि जोड़ें जो संकेतों का चयन करते समय जानकारी प्रदर्शित करेगी
कॉन्फ़िगरेशन फ़ाइल बदलें
मैं आपको याद दिलाता हूं कि डायलॉग को प्रदर्शित करने और इसे बदलने के लिए कॉन्फ़िगरेशन फ़ाइल (रेस / xml / searchable.xml) की आवश्यकता होती है, उदाहरण के लिए, आवाज खोज का उपयोग करने के लिए। डायनामिक संकेत का उपयोग करने के लिए, आपको पैरामीटर जोड़ना होगा: android: searchSuggestAuthority फ़ाइल में। यह सामग्री प्रदाता के प्राधिकरण स्ट्रिंग से मेल खाएगा। इसके अलावा, हम पैरामीटर एंड्रॉइड जोड़ते हैं: searchMode = "queryRewriteFromText", इसका मान इंगित करता है कि डायलॉग में खोज स्ट्रिंग को नेविगेट करते समय ओवरराइट किया जाएगा, उदाहरण के लिए, ट्रैकबॉल का उपयोग करके। हम चयन ऑपरेटर को निर्दिष्ट करने वाले मापदंडों को भी जोड़ेंगे, टूलटिप के चुने जाने पर भेजे गए इरादे का प्रकार, और सामग्री प्रदाता से अनुरोध करने के लिए संवाद में टाइप किए गए पात्रों की न्यूनतम संख्या।
फ़ाइल रेस / xml / searchable.xml<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:searchSettingsDescription="@string/settings_description" android:searchMode="queryRewriteFromText" android:includeInGlobalSearch="true" android:searchSuggestAuthority="com.example.search.SuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.example.search.SuggestionProvider/records" android:searchSuggestThreshold="1" android:searchSuggestSelection=" ?"> </searchable>
एक सामग्री प्रदाता बनाएँ
वास्तव में, हमारा कंटेंट प्रदाता दूसरों से अलग नहीं है। लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि संकेतों की तालिका से प्रत्येक पंक्ति के लिए आवश्यक कॉलम चुने गए हैं, जिन्हें खोज प्रबंधक द्वारा आवश्यक है। हम सामग्री प्रदाता क्वेरी () विधि का उपयोग करके संकेतों के लिए डेटा क्वेरी करेंगे। इसके अलावा, यह हर बार कहा जाएगा कि उपयोगकर्ता संवाद में एक नया चरित्र टाइप करता है। इस प्रकार, क्वेरी () पद्धति को क्वेरी से मेल खाने वाले तालिका में रिकॉर्ड पर कर्सर को वापस करना चाहिए, और फिर खोज प्रबंधक प्रदर्शन को प्रदर्शित करने में सक्षम होंगे। कोड टिप्पणियों में विधि का विवरण देखें।
अनुरोध पाठ स्वयं URI से जोड़ा जाएगा, इसलिए इसे प्राप्त करने में कोई समस्या नहीं होगी, आपको बस मानक getLastPathSegment () विधि का उपयोग करने की आवश्यकता है।
एक संकेत तालिका बनाना
जब खोज प्रबंधक अभिलेखों की ओर इशारा करते हुए एक कर्सर प्राप्त करता है, तो यह प्रत्येक रिकॉर्ड के लिए कॉलम के एक विशिष्ट सेट की अपेक्षा करता है। दो अनिवार्य हैं: _ID प्रत्येक टूलटिप का विशिष्ट पहचानकर्ता है, और SUGGEST_COLUMN_TEXT_1 टूलटिप पाठ है।
कई वैकल्पिक कॉलम हैं, उदाहरण के लिए, SUGGEST_COLUMN_ICON_1 का उपयोग करके, आप प्रत्येक रिकॉर्ड को टूलटिप के बाईं ओर प्रदर्शित आइकन (बहुत सुविधाजनक, उदाहरण के लिए, संपर्क खोजने के लिए) के लिए परिभाषित कर सकते हैं।
आशय के लिए डेटा प्रकार परिभाषा
चूंकि हम एक यूआरआई के माध्यम से अनुरोध पर डेटा प्रसारित करते हैं, इसलिए हमें यह निर्धारित करने के लिए एक तंत्र की आवश्यकता है कि कौन सा टूलटिप चुना गया था। इसके दो तरीके हैं। पहला एक अलग कॉलम SUGGEST_COLUMN_INTENT_DATA को परिभाषित करना है, जिसमें प्रत्येक रिकॉर्ड के लिए अद्वितीय डेटा होगा, फिर आप GetData () या getDataString () के माध्यम से इंटेंट से डेटा प्राप्त कर सकते हैं। दूसरा विकल्प कॉन्फ़िगरेशन फ़ाइल (res / xml / searchable.xml) में सभी इरादों के लिए डेटा प्रकार निर्धारित करना है और फिर SUGGEST_COLUMN_INTUM_DATA_ID कॉलम का उपयोग करके URI के प्रत्येक इरादे के लिए अद्वितीय डेटा जोड़ें।
हम दूसरे विकल्प का उपयोग करेंगे, और मैंने तालिका में अलग-अलग कॉलम नहीं बनाए हैं, क्योंकि आप SUGGEST_COLUMN_INTENT_DATA_ID से तालिका की पंक्ति में मैपिंग बना सकते हैं। मैं
जोड़ूंगा कि SQLite में खेल हित के लिए,
FTS3 का उपयोग खोज के लिए किया
गया था ,
अर्थात , मुझे एक वर्चुअल टेबल बनानी थी, जिसके लिए आप स्तंभों (बाधाओं) पर प्रतिबंध नहीं लगा सकते हैं, जैसे कि PRIMARY KEY या पूर्ण / नहीं NULL। लेकिन वर्चुअल टेबल में एक अद्वितीय पंक्ति पहचानकर्ता होता है, और मैपिंग को इसमें सेट करता है। यही है, इरादे के डेटा में निम्नलिखित रूप होंगे: "/" और तालिका में पंक्ति की पंक्ति को URI में जोड़ा जाएगा।
सूचना प्रदर्शित करने के लिए एक गतिविधि बनाना
इंटरफ़ेस रेस / लेआउट / record_activity.xml में है। वह सभी गतिविधि जो इंटेंट से डेटा प्राप्त करती है, एक सामग्री प्रदाता के माध्यम से एक कर्सर का अनुरोध करें, और एक पाठ क्षेत्र में रिकॉर्ड प्रदर्शित करें।
फ़ाइल रेस / लेआउट / record_activity.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp"> <TextView android:id="@+id/record_header" android:textSize="25dp" android:textColor="?android:textColorPrimary" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
अब हम प्रकट में सामग्री प्रदाता और नई गतिविधि के बारे में जानकारी दर्ज करेंगे, साथ ही, चूंकि अब हमारे पास दो गतिविधियाँ हैं, हम डिफ़ॉल्ट रूप से खोज के लिए ज़िम्मेदार व्यक्ति को इंगित करेंगे।
AndroidManifest.xml फ़ाइल <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.search" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:name=".RecordActivity" android:theme="@android:style/Theme.NoTitleBar" /> <provider android:name=".SuggestionProvider" android:authorities="com.example.search.SuggestionProvider" /> <meta-data android:name="android.app.default_searchable" android:value=".Main" /> </application> <uses-sdk android:minSdkVersion="5" /> </manifest>
खोज के प्रभारी गतिविधि में इरादे को रोकना
उपरोक्त सभी चरणों के बाद, आपको मुख्य गतिविधि में इरादे को संसाधित करने की आवश्यकता है, जो खोज के लिए जिम्मेदार है। चूंकि हमने टूलटिप्स के लिए इंटेंट प्रकार को व्यू के रूप में परिभाषित किया है, इसलिए हमें केवल इसके लिए एक चेक जोड़ने की आवश्यकता है। यदि शर्त पूरी हो जाती है, तो रिकॉर्डअक्टिविटी इंटेंट का उपयोग करके लॉन्च की जाती है, जिसमें डेटा तालिका में URI + "/" + टूलटिप लिखा जाता है।
त्वरित खोज बॉक्स एकीकरण
कस्टम सुझावों का उपयोग करने के लिए अपने आवेदन को संशोधित करने के बाद, आप इसे सिस्टम खोज में जोड़ सकते हैं। ऐसा करने के लिए, searchable.xml फ़ाइल में दो पैरामीटर जोड़ें:
- एंड्रॉइड: इनग्लोबलसर्च = "सत्य" को शामिल करता है - इंगित करता है कि क्यूएसबी आपके आवेदन को खोज सकता है।
- android: searchSettingsDescription = "@ string / settings_description" - आपके एप्लिकेशन के विवरण को इंगित करता है, जो त्वरित खोज बॉक्स सेट करते समय प्रदर्शित होता है। ये सेटिंग सेटिंग्स-> सर्च में हैं।
ये विकल्प Android 1.6 से उपलब्ध हैं, अर्थात, नीचे दिए गए संस्करणों के लिए, आप QSB के लिए अपने आवेदन को कॉन्फ़िगर नहीं कर सकते।
स्रोत कोड
मैं सभी आवश्यक कक्षाओं का पूर्ण स्रोत कोड प्रस्तुत करता हूं। Main.java - मुख्य गतिविधि जो सामग्री प्रदाता के लिए अनुरोधों को खोजने और भेजने के लिए जिम्मेदार है, RecordActivity.java - एक विशिष्ट रिकॉर्ड के लिए डेटा के साथ एक आशय प्राप्त करता है, रिकॉर्ड के लिए एक लिंक प्राप्त करता है और जानकारी प्रदर्शित करता है। SuggestionProvider.java एक सामग्री प्रदाता है जो खोज प्रबंधक से अनुरोधों की तालिका के लिए अनुरोध करता है। RecordsDbHelper.java - तालिका बनाने, उसे भरने, आवश्यक प्रदर्शन स्थापित करने और "मिलान" रिकॉर्ड के लिए स्वयं जिम्मेदार है।
Main.java फ़ाइल package com.example.search; import android.app.ListActivity; import android.app.SearchManager; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class Main extends ListActivity { private EditText text; private Button add; private RecordsDbHelper mDbHelper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mDbHelper = new RecordsDbHelper(this); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
फाइल रिकॉर्डअक्टिविटी.जावा package com.example.search; import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; public class RecordActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.record_activity);
फ़ाइल सुझाव package com.example.search; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; public class SuggestionProvider extends ContentProvider{ private RecordsDbHelper mDbHelper; public static String AUTHORITY = "com.example.search.SuggestionProvider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/records");
फ़ाइल रिकॉर्ड्सDHHperper.java package com.example.search; import java.util.HashMap; import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.provider.BaseColumns; import android.util.Log; public class RecordsDbHelper {
पूरा प्रोजेक्ट
code.google.com पर लिया जा सकता है
आपका ध्यान के लिए धन्यवाद!