কাস্টম অনুসন্ধান পরামর্শ যোগ করুন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
অ্যান্ড্রয়েডের জন্য Jetpack Compose হলো প্রস্তাবিত UI টুলকিট। Compose-এ কীভাবে সার্চ ফাংশন যুক্ত করবেন তা জানুন।

অ্যান্ড্রয়েড সার্চ ডায়ালগ বা সার্চ উইজেট ব্যবহার করার সময়, আপনি আপনার অ্যাপের ডেটা থেকে তৈরি কাস্টম সার্চ সাজেশন দিতে পারেন। উদাহরণস্বরূপ, যদি আপনার অ্যাপটি একটি অভিধান হয়, তবে ব্যবহারকারী তার অনুসন্ধান সম্পূর্ণ করার আগেই আপনি সার্চ ফিল্ডে প্রবেশ করানো টেক্সটের সাথে মেলে এমন অভিধান থেকে শব্দ সাজেস্ট করতে পারেন। এই সাজেশনগুলো মূল্যবান, কারণ এগুলো কার্যকরভাবে অনুমান করতে পারে যে ব্যবহারকারী কী চায় এবং তাৎক্ষণিকভাবে তা সরবরাহ করতে পারে। চিত্র ১-এ কাস্টম সাজেশনসহ একটি সার্চ ডায়ালগের উদাহরণ দেখানো হয়েছে।

একবার আপনি নিজস্ব পরামর্শ দিলে, সেগুলোকে সিস্টেম-ব্যাপী কুইক সার্চ বক্সেও উপলব্ধ করতে পারেন, যার ফলে আপনার অ্যাপের বাইরে থেকেও আপনার কন্টেন্ট অ্যাক্সেস করা যায়।

কাস্টম সাজেশন যোগ করার আগে, আপনার অ্যাপে অনুসন্ধানের জন্য অ্যান্ড্রয়েড সার্চ ডায়ালগ অথবা একটি সার্চ উইজেট প্রয়োগ করুন। ‘সার্চ ইন্টারফেস তৈরি করুন’ এবং ‘কন্টেন্ট প্রোভাইডার’ দেখুন।

মৌলিক বিষয়গুলো

চিত্র ১. কাস্টম সার্চ সাজেশনসহ একটি সার্চ ডায়ালগের স্ক্রিনশট।

যখন ব্যবহারকারী একটি কাস্টম সাজেশন নির্বাচন করেন, তখন সিস্টেম আপনার সার্চযোগ্য অ্যাক্টিভিটিতে একটি Intent পাঠায়। একটি সাধারণ সার্চ কোয়েরির মতো নয়, যা ACTION_SEARCH অ্যাকশন সহ একটি ইন্টেন্ট পাঠায়, আপনি এর পরিবর্তে আপনার কাস্টম সাজেশনগুলোকে ACTION_VIEW বা অন্য যেকোনো ইন্টেন্ট অ্যাকশন—ব্যবহার করার জন্য সংজ্ঞায়িত করতে পারেন এবং নির্বাচিত সাজেশনের সাথে প্রাসঙ্গিক ডেটাও অন্তর্ভুক্ত করতে পারেন। অভিধানের উদাহরণে, যখন ব্যবহারকারী একটি সাজেশন নির্বাচন করেন, তখন অ্যাপটি অভিধানে মিল খোঁজার পরিবর্তে অবিলম্বে সেই শব্দটির সংজ্ঞা খুলতে পারে।

নিজস্ব পরামর্শ দেওয়ার জন্য, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  • "একটি সার্চ ইন্টারফেস তৈরি করুন" অংশে বর্ণিত পদ্ধতি অনুসারে একটি মৌলিক অনুসন্ধানযোগ্য অ্যাক্টিভিটি বাস্তবায়ন করুন।
  • কাস্টম সাজেশন প্রদানকারী কন্টেন্ট প্রোভাইডার সম্পর্কিত তথ্য দিয়ে অনুসন্ধানযোগ্য কনফিগারেশনটি পরিবর্তন করুন।
  • আপনার পরামর্শগুলোর জন্য SQLiteDatabase এর মতো কোনো ডেটাবেসে একটি টেবিল তৈরি করুন এবং প্রয়োজনীয় কলামগুলো দিয়ে টেবিলটি ফরম্যাট করুন।
  • এমন একটি কন্টেন্ট প্রোভাইডার তৈরি করুন যার আপনার সাজেশন্স টেবিলে অ্যাক্সেস থাকবে এবং আপনার ম্যানিফেস্টে প্রোভাইডারটিকে ডিক্লেয়ার করুন।
  • ব্যবহারকারী যখন কোনো সাজেশন নির্বাচন করবেন, তখন যে ধরনের Intent পাঠানো হবে তা ঘোষণা করুন, যার মধ্যে কাস্টম অ্যাকশন এবং কাস্টম ডেটা অন্তর্ভুক্ত থাকবে।

অ্যান্ড্রয়েড সিস্টেম যেমন সার্চ ডায়ালগ প্রদর্শন করে, তেমনই আপনার সার্চ সাজেশনগুলোও দেখায়। আপনার একটি কন্টেন্ট প্রোভাইডার প্রয়োজন, যেখান থেকে সিস্টেম আপনার সাজেশনগুলো সংগ্রহ করতে পারে। কীভাবে একটি কন্টেন্ট প্রোভাইডার তৈরি করতে হয় তা জানতে 'কন্টেন্ট প্রোভাইডার' পড়ুন।

যখন সিস্টেম আপনার কার্যকলাপকে অনুসন্ধানযোগ্য হিসেবে শনাক্ত করে এবং অনুসন্ধানের জন্য পরামর্শ প্রদান করে, তখন ব্যবহারকারী কোনো কোয়েরি প্রবেশ করালে নিম্নলিখিত কার্যপ্রণালীটি সম্পন্ন হয়:

  1. সিস্টেমটি সার্চ কোয়েরি টেক্সট—অর্থাৎ, এ পর্যন্ত যা কিছু লেখা হয়েছে—সেটি গ্রহণ করে এবং আপনার সাজেশনগুলো পরিচালনা করে এমন কন্টেন্ট প্রোভাইডারের কাছে একটি কোয়েরি পাঠায়।
  2. আপনার কন্টেন্ট প্রোভাইডার একটি Cursor ফেরত দেয়, যা সার্চ কোয়েরি টেক্সটের সাথে প্রাসঙ্গিক সমস্ত সাজেশনের দিকে নির্দেশ করে।
  3. সিস্টেমটি Cursor দ্বারা প্রদত্ত পরামর্শগুলির তালিকা প্রদর্শন করে।

কাস্টম সাজেশনগুলো প্রদর্শিত হলে, নিম্নলিখিত ঘটনাগুলো ঘটতে পারে:

  • যদি ব্যবহারকারী অন্য কোনো অক্ষর প্রবেশ করান বা অনুসন্ধানে কোনো পরিবর্তন আনেন, তাহলে পূর্ববর্তী ধাপগুলো পুনরাবৃত্তি হয় এবং সেই অনুযায়ী পরামর্শ তালিকাটি আপডেট হয়।
  • যদি ব্যবহারকারী অনুসন্ধানটি সম্পাদন করেন, তাহলে সাজেশনগুলো উপেক্ষা করা হয় এবং সাধারণ ACTION_SEARCH ইন্টেন্ট ব্যবহার করে অনুসন্ধানটি আপনার অনুসন্ধানযোগ্য অ্যাক্টিভিটিতে পৌঁছে দেওয়া হয়।
  • যদি ব্যবহারকারী কোনো সাজেশন নির্বাচন করেন, তাহলে আপনার সার্চযোগ্য অ্যাক্টিভিটিতে একটি ইন্টেন্ট পাঠানো হয়, যা একটি কাস্টম অ্যাকশন এবং কাস্টম ডেটা বহন করে, যাতে আপনার অ্যাপ সাজেস্ট করা কন্টেন্টটি খুলতে পারে।

অনুসন্ধানযোগ্য কনফিগারেশন পরিবর্তন করুন

কাস্টম সাজেশনের সাপোর্ট যোগ করতে, আপনার সার্চেবল কনফিগারেশন ফাইলের <searchable> এলিমেন্টে android:searchSuggestAuthority অ্যাট্রিবিউটটি যোগ করুন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:

<?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.MyCustomSuggestionProvider">
</searchable>

প্রতিটি সাজেশনের সাথে আপনি কী ধরনের ইনটেন্ট যুক্ত করছেন এবং আপনার কন্টেন্ট প্রোভাইডারে কোয়েরিগুলো কীভাবে ফরম্যাট করতে চান, তার উপর নির্ভর করে আপনার অতিরিক্ত অ্যাট্রিবিউটের প্রয়োজন হতে পারে। অন্যান্য ঐচ্ছিক অ্যাট্রিবিউটগুলো পরবর্তী সেকশনগুলোতে আলোচনা করা হয়েছে।

একটি কন্টেন্ট প্রোভাইডার তৈরি করুন

কাস্টম সাজেশনের জন্য একটি কন্টেন্ট প্রোভাইডার তৈরি করতে, প্রথমে কন্টেন্ট প্রোভাইডার কীভাবে তৈরি করতে হয় তা জানতে 'কন্টেন্ট প্রোভাইডার' অংশটি দেখুন। কাস্টম সাজেশনের জন্য একটি কন্টেন্ট প্রোভাইডার অন্য যেকোনো কন্টেন্ট প্রোভাইডারের মতোই। তবে, আপনার দেওয়া প্রতিটি সাজেশনের জন্য, Cursor সংশ্লিষ্ট সারিতে অবশ্যই নির্দিষ্ট কলাম অন্তর্ভুক্ত থাকতে হবে, যা সিস্টেম সাজেশনগুলো ফরম্যাট করার জন্য বোঝে এবং ব্যবহার করে।

যখন ব্যবহারকারী সার্চ ডায়ালগ বা সার্চ উইজেটে টেক্সট টাইপ করেন, তখন প্রতিটি অক্ষর টাইপ হওয়ার সাথে সাথে সিস্টেম query() কল করে সাজেশনের জন্য আপনার কন্টেন্ট প্রোভাইডারকে কোয়েরি করে। query() এর ইমপ্লিমেন্টেশনে, আপনার কন্টেন্ট প্রোভাইডারকে অবশ্যই সাজেশনের ডেটা সার্চ করতে হবে এবং একটি Cursor রিটার্ন করতে হবে, যা সেই সারিগুলোকে নির্দেশ করবে যেগুলোকে এটি উপযুক্ত সাজেশন বলে মনে করে।

কাস্টম সাজেশনের জন্য কন্টেন্ট প্রোভাইডার তৈরির বিস্তারিত আলোচনা নিম্নলিখিত দুটি বিভাগে করা হয়েছে:

সাজেশন কোয়েরিটি পরিচালনা করুন
সিস্টেমটি কীভাবে আপনার কন্টেন্ট প্রোভাইডারের কাছে অনুরোধ পাঠায় এবং কীভাবে সেগুলি পরিচালনা করতে হয়।
একটি পরামর্শ টেবিল তৈরি করুন
প্রতিটি কোয়েরির সাথে ফেরত আসা Cursor সিস্টেম যে কলামগুলো প্রত্যাশা করে, সেগুলো কীভাবে নির্ধারণ করতে হয়।

সাজেশন কোয়েরিটি পরিচালনা করুন

যখন সিস্টেম আপনার কন্টেন্ট প্রোভাইডারের কাছে সাজেশনের জন্য অনুরোধ করে, তখন এটি আপনার কন্টেন্ট প্রোভাইডারের query() মেথডকে কল করে। আপনার সাজেশন ডেটা অনুসন্ধান করতে এবং আপনার কাছে প্রাসঙ্গিক বলে মনে হওয়া সাজেশনগুলো নির্দেশকারী একটি Cursor রিটার্ন করতে এই মেথডটি ইমপ্লিমেন্ট করুন।

সিস্টেম আপনার query() মেথডে যে প্যারামিটারগুলো পাঠায়, তার একটি সারসংক্ষেপ নিচে ক্রমানুসারে দেওয়া হলো:

  1. uri

    সর্বদা একটি কন্টেন্ট Uri , যা নিম্নরূপ বিন্যাসে থাকে:

    content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY
    

    সিস্টেমের ডিফল্ট আচরণ হলো এই URI-টি প্রেরণ করা এবং এর সাথে কোয়েরি টেক্সট যুক্ত করা:

    content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY/puppies
    

    শেষের কোয়েরি টেক্সটটি URI এনকোডিং নিয়ম ব্যবহার করে এনকোড করা হয়, তাই সার্চ করার আগে আপনাকে এটি ডিকোড করতে হতে পারে।

    ` optional.suggest.path অংশটি URI-তে তখনই অন্তর্ভুক্ত হয়, যখন আপনি আপনার সার্চযোগ্য কনফিগারেশন ফাইলে android:searchSuggestPath অ্যাট্রিবিউটের মাধ্যমে সেরকম একটি পাথ সেট করেন। এটি কেবল তখনই প্রয়োজন হয়, যখন আপনি একাধিক সার্চযোগ্য অ্যাক্টিভিটির জন্য একই কন্টেন্ট প্রোভাইডার ব্যবহার করেন। যদি এমনটি হয়, তবে সাজেশন কোয়েরির উৎসটি সুস্পষ্ট করুন।

  2. projection
    সর্বদা শূন্য।
  3. selection
    আপনার সার্চযোগ্য কনফিগারেশন ফাইলের android:searchSuggestSelection অ্যাট্রিবিউটে প্রদত্ত মান, অথবা আপনি যদি android:searchSuggestSelection অ্যাট্রিবিউটটি ঘোষণা না করেন তবে null। পরবর্তী বিভাগে এই বিষয়ে আরও আলোচনা করা হয়েছে।
  4. selectionArgs
    আপনার সার্চেবল কনফিগারেশনে android:searchSuggestSelection অ্যাট্রিবিউটটি ডিক্লেয়ার করলে, অ্যারের প্রথম এবং একমাত্র উপাদান হিসেবে সার্চ কোয়েরিটি থাকে। যদি আপনি android:searchSuggestSelection ডিক্লেয়ার না করেন, তাহলে এই প্যারামিটারটি null হয়। পরবর্তী বিভাগে এই বিষয়ে আরও আলোচনা করা হয়েছে।
  5. sortOrder
    সর্বদা শূন্য।

সিস্টেমটি আপনাকে দুইভাবে সার্চ কোয়েরি টেক্সট পাঠাতে পারে। ডিফল্ট পদ্ধতিটি হলো, uri প্যারামিটারে পাঠানো 'content URI'-এর শেষ পাথ হিসেবে কোয়েরি টেক্সটটি অন্তর্ভুক্ত করা। তবে, যদি আপনি আপনার সার্চেবল কনফিগারেশনের ' android:searchSuggestSelection ' অ্যাট্রিবিউটে একটি সিলেকশন ভ্যালু অন্তর্ভুক্ত করেন, তাহলে কোয়েরি টেক্সটটি selectionArgs ' স্ট্রিং অ্যারের প্রথম উপাদান হিসেবে পাস হয়। এই দুটি বিকল্প নিচে বর্ণনা করা হলো।

Uri-তে কোয়েরিটি পান

ডিফল্টরূপে, কোয়েরিটি uri প্যারামিটারের—একটি Uri অবজেক্টের—শেষ অংশ হিসেবে যুক্ত হয়। এই ক্ষেত্রে কোয়েরি টেক্সটটি পেতে, getLastPathSegment() ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val query: String = uri.lastPathSegment.toLowerCase()

জাভা

String query = uri.getLastPathSegment().toLowerCase();

এটি Uri এর শেষ অংশটি ফেরত দেয়, যা হলো ব্যবহারকারীর প্রবেশ করানো কোয়েরি টেক্সট।

সিলেকশন আর্গুমেন্টগুলিতে কোয়েরিটি পান।

URI ব্যবহার করার পরিবর্তে, আপনার query() মেথডের জন্য লুক-আপ করার জন্য প্রয়োজনীয় সবকিছু গ্রহণ করা আরও যুক্তিযুক্ত হতে পারে, এবং আপনি হয়তো চাইবেন selectionselectionArgs প্যারামিটারগুলোতে উপযুক্ত মান থাকুক। এই ক্ষেত্রে, আপনার SQLite সিলেকশন স্ট্রিং সহ android:searchSuggestSelection অ্যাট্রিবিউটটি আপনার সার্চেবল কনফিগারেশনে যোগ করুন। সিলেকশন স্ট্রিং-এর মধ্যে, আসল সার্চ কোয়েরির জন্য একটি প্লেসহোল্ডার হিসেবে একটি প্রশ্নবোধক চিহ্ন ( ? ) অন্তর্ভুক্ত করুন। সিস্টেমটি selection স্ট্রিং-কে selection প্যারামিটার হিসেবে এবং সার্চ কোয়েরি-কে selectionArgs অ্যারের প্রথম উপাদান হিসেবে ব্যবহার করে query() মেথডকে কল করে।

উদাহরণস্বরূপ, একটি পূর্ণ-পাঠ্য অনুসন্ধান বিবৃতি তৈরি করতে আপনি 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.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestSelection="word MATCH ?">
</searchable>

এই কনফিগারেশনে, আপনার query() মেথডটি selection প্যারামিটার হিসেবে "word MATCH ?" এবং selectionArgs প্যারামিটার হিসেবে সার্চ কোয়েরি প্রদান করে। যখন আপনি এগুলোকে একটি SQLite query() মেথডে তাদের নিজ নিজ আর্গুমেন্ট হিসেবে পাস করেন, তখন সেগুলো একসাথে সংশ্লেষিত হয়—অর্থাৎ, প্রশ্নবোধক চিহ্নটি কোয়েরি টেক্সট দ্বারা প্রতিস্থাপিত হয়। যদি আপনি এইভাবে সাজেশন কোয়েরি পান এবং কোয়েরি টেক্সটে ওয়াইল্ডকার্ড যোগ করার প্রয়োজন হয়, তবে সেগুলোকে selectionArgs প্যারামিটারের শেষে বা আগে যুক্ত করুন, কারণ এই মানটি উদ্ধৃতি চিহ্নের মধ্যে আবদ্ধ থাকে এবং প্রশ্নবোধক চিহ্নের জায়গায় বসে যায়।

পূর্ববর্তী উদাহরণের আরেকটি অ্যাট্রিবিউট হলো android:searchSuggestIntentAction , যা ব্যবহারকারী কোনো সাজেশন নির্বাচন করলে প্রতিটি ইন্টেন্টের সাথে পাঠানো ইন্টেন্ট অ্যাকশনকে সংজ্ঞায়িত করে। এই বিষয়ে "সাজেশনের জন্য একটি ইন্টেন্ট ডিক্লেয়ার করুন" বিভাগে আরও আলোচনা করা হয়েছে।

একটি পরামর্শ টেবিল তৈরি করুন

যখন আপনি একটি Cursor ব্যবহার করে সিস্টেমে সাজেশন ফেরত পাঠান, তখন সিস্টেম প্রতিটি সারিতে নির্দিষ্ট কলাম আশা করে। আপনি আপনার সাজেশনের ডেটা ডিভাইসের SQLite ডেটাবেসে, ওয়েব সার্ভারের ডেটাবেসে, বা ডিভাইস বা ওয়েবের অন্য কোনো ফরম্যাটে সংরক্ষণ করুন না কেন, সাজেশনগুলোকে একটি টেবিলের সারি হিসেবে ফরম্যাট করুন এবং একটি Cursor মাধ্যমে সেগুলো উপস্থাপন করুন।

সিস্টেমটি একাধিক কলাম বুঝতে পারে, কিন্তু সেগুলোর মধ্যে মাত্র দুটি প্রয়োজন:

_ID
প্রতিটি সাজেশনের জন্য একটি অনন্য পূর্ণসংখ্যা সারি আইডি। একটি ListView তে সাজেশনগুলো প্রদর্শন করার জন্য সিস্টেমের এটি প্রয়োজন।
SUGGEST_COLUMN_TEXT_1
যে স্ট্রিংটি একটি পরামর্শ হিসেবে উপস্থাপন করা হয়।

নিচের কলামগুলো সবই ঐচ্ছিক। এগুলোর বেশিরভাগই পরবর্তী বিভাগগুলোতে আরও আলোচনা করা হয়েছে।

SUGGEST_COLUMN_TEXT_2
একটি স্ট্রিং। আপনার Cursor যদি এই কলামটি থাকে, তাহলে সমস্ত সাজেশন দুই-লাইনের ফরম্যাটে দেওয়া হবে। এই কলামের স্ট্রিংটি মূল সাজেশন টেক্সটের নিচে একটি দ্বিতীয়, ছোট লাইন হিসেবে প্রদর্শিত হয়। কোনো দ্বিতীয় টেক্সট নেই বোঝাতে এটি নাল বা খালি হতে পারে।
SUGGEST_COLUMN_ICON_1
একটি অঙ্কনযোগ্য রিসোর্স, কন্টেন্ট বা ফাইল URI স্ট্রিং। যদি আপনার Cursor এই কলামটি অন্তর্ভুক্ত থাকে, তাহলে সমস্ত সাজেশন একটি আইকন-ও-টেক্সট ফরম্যাটে প্রদান করা হয়, যেখানে অঙ্কনযোগ্য আইকনটি বাম দিকে থাকে। এই সারিতে কোনো আইকন না থাকার অর্থ বোঝাতে এর মান নাল বা শূন্য হতে পারে।
SUGGEST_COLUMN_ICON_2
একটি ড্রয়েবল রিসোর্স, কন্টেন্ট, বা ফাইল URI স্ট্রিং। যদি আপনার Cursor এই কলামটি অন্তর্ভুক্ত থাকে, তাহলে সমস্ত সাজেশন একটি আইকন-ও-টেক্সট ফরম্যাটে প্রদান করা হয়, যেখানে আইকনটি ডানদিকে থাকে। এই সারিতে কোনো আইকন না থাকার অর্থ বোঝাতে এটি নাল বা শূন্য হতে পারে।
SUGGEST_COLUMN_INTENT_ACTION
একটি ইন্টেন্ট অ্যাকশন স্ট্রিং। যদি এই কলামটি বিদ্যমান থাকে এবং প্রদত্ত সারিতে একটি মান থাকে, তাহলে সাজেশনের ইন্টেন্ট তৈরি করার সময় এখানে সংজ্ঞায়িত অ্যাকশনটি ব্যবহৃত হয়। যদি এলিমেন্টটি প্রদান করা না হয়, তাহলে আপনার সার্চেবল কনফিগারেশনে থাকা android:searchSuggestIntentAction ফিল্ড থেকে অ্যাকশনটি নেওয়া হয়। যদি আপনার অ্যাকশন সমস্ত সাজেশনের জন্য একই হয়, android:searchSuggestIntentAction ব্যবহার করে অ্যাকশনটি নির্দিষ্ট করা এবং এই কলামটি বাদ দেওয়া আরও বেশি কার্যকর।
SUGGEST_COLUMN_INTENT_DATA
একটি ডেটা URI স্ট্রিং। যদি এই কলামটি বিদ্যমান থাকে এবং প্রদত্ত সারিতে একটি মান ধারণ করে, তবে সাজেশনের ইন্টেন্ট তৈরি করার সময় এই ডেটা ব্যবহার করা হয়। যদি এলিমেন্টটি প্রদান করা না হয়, তবে আপনার সার্চেবল কনফিগারেশনে থাকা android:searchSuggestIntentData ফিল্ড থেকে ডেটা নেওয়া হয়। যদি কোনো উৎসই প্রদান করা না হয়, তবে ইন্টেন্টের ডেটা ফিল্ডটি নাল (null) থাকে। যদি আপনার ডেটা সমস্ত সাজেশনের জন্য একই হয়, অথবা একটি ধ্রুবক অংশ এবং একটি নির্দিষ্ট আইডি ব্যবহার করে বর্ণনা করা যায়, তবে android:searchSuggestIntentData ব্যবহার করে এটি নির্দিষ্ট করা এবং এই কলামটি বাদ দেওয়া আরও কার্যকর।
SUGGEST_COLUMN_INTENT_DATA_ID
একটি URI পাথ স্ট্রিং। যদি এই কলামটি বিদ্যমান থাকে এবং প্রদত্ত সারিতে একটি মান থাকে, তাহলে "/" এবং এই মানটি ইন্টেন্টের ডেটা ফিল্ডে যুক্ত করা হয়। এটি কেবল তখনই ব্যবহার করুন যখন সার্চেবল কনফিগারেশনে android:searchSuggestIntentData অ্যাট্রিবিউট দ্বারা নির্দিষ্ট ডেটা ফিল্ডটি ইতিমধ্যেই একটি উপযুক্ত বেস স্ট্রিং-এ সেট করা থাকে।
SUGGEST_COLUMN_INTENT_EXTRA_DATA
ইচ্ছামত ডেটা। যদি এই কলামটি বিদ্যমান থাকে এবং কোনো নির্দিষ্ট সারিতে একটি মান ধারণ করে, তবে এটিই সেই অতিরিক্ত ডেটা যা সাজেশনের অভিপ্রায় তৈরি করার সময় ব্যবহৃত হয়। যদি এটি প্রদান করা না হয়, তবে অভিপ্রায়ের অতিরিক্ত ডেটা ফিল্ডটি নাল (null) থাকে। এই কলামটি সাজেশনগুলোকে অতিরিক্ত ডেটা সরবরাহ করার সুযোগ দেয়, যা অভিপ্রায়ের EXTRA_DATA_KEY কী-তে একটি অতিরিক্ত উপাদান হিসেবে অন্তর্ভুক্ত হয়।
SUGGEST_COLUMN_QUERY
যদি এই কলামটি এবং প্রদত্ত সারিতে এই উপাদানটি বিদ্যমান থাকে, তবে সাজেশনের কোয়েরি তৈরি করার সময় এই ডেটাটিই ব্যবহৃত হয় এবং এটি ইন্টেন্টের QUERY কী-তে একটি এক্সট্রা হিসেবে অন্তর্ভুক্ত থাকে। সাজেশনের অ্যাকশন ACTION_SEARCH হলে এটি আবশ্যক, অন্যথায় ঐচ্ছিক।
SUGGEST_COLUMN_SHORTCUT_ID
শুধুমাত্র কুইক সার্চ বক্সের জন্য সাজেশন দেওয়ার সময় ব্যবহৃত হয়। এই কলামটি নির্দেশ করে যে একটি সার্চ সাজেশনকে শর্টকাট হিসেবে সংরক্ষণ করতে হবে কিনা এবং সেটিকে যাচাই করতে হবে কিনা। সাধারণত, ব্যবহারকারী যখন কুইক সার্চ বক্স থেকে কোনো সাজেশনে ট্যাপ করেন, তখন শর্টকাট তৈরি হয়। যদি এটি অনুপস্থিত থাকে, তাহলে ফলাফলটি শর্টকাট হিসেবে সংরক্ষিত হয় এবং কখনও রিফ্রেশ হয় না। যদি SUGGEST_NEVER_MAKE_SHORTCUT এ সেট করা থাকে, তাহলে ফলাফলটি শর্টকাট হিসেবে সংরক্ষিত হয় না। অন্যথায়, SUGGEST_URI_PATH_SHORTCUT ব্যবহার করে একটি হালনাগাদ সাজেশনের জন্য পুনরায় পরীক্ষা করতে শর্টকাট আইডিটি ব্যবহৃত হয়।
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
শুধুমাত্র কুইক সার্চ বক্সের জন্য সাজেশন দেওয়ার সময় ব্যবহৃত হয়। এই কলামটি নির্দিষ্ট করে যে, কুইক সার্চ বক্সে এই সাজেশনের শর্টকাটটি রিফ্রেশ করার সময় SUGGEST_COLUMN_ICON_2 থেকে কোনো আইকনের পরিবর্তে একটি স্পিনার অবশ্যই দেখানো হবে।

এই কলামগুলোর বেশিরভাগই পরবর্তী বিভাগগুলোতে আরও বিস্তারিতভাবে আলোচনা করা হয়েছে।

পরামর্শের জন্য একটি অভিপ্রায় ঘোষণা করুন

যখন ব্যবহারকারী সার্চ ডায়ালগ বা উইজেটের নিচে প্রদর্শিত তালিকা থেকে কোনো সাজেশন নির্বাচন করেন, তখন সিস্টেম আপনার সার্চযোগ্য অ্যাক্টিভিটিতে একটি কাস্টম Intent পাঠায়। আপনাকে অবশ্যই ইন্টেন্টটির জন্য অ্যাকশন এবং ডেটা নির্ধারণ করতে হবে।

অভিপ্রায়মূলক পদক্ষেপ ঘোষণা করুন

একটি কাস্টম সাজেশনের জন্য সবচেয়ে সাধারণ ইন্টেন্ট অ্যাকশন হলো ACTION_VIEW , যা কোনো কিছু খোলার জন্য উপযুক্ত, যেমন কোনো শব্দের সংজ্ঞা, কোনো ব্যক্তির যোগাযোগের তথ্য বা একটি ওয়েব পেজ। তবে, ইন্টেন্ট অ্যাকশন অন্য যেকোনো অ্যাকশনও হতে পারে এবং প্রতিটি সাজেশনের জন্য তা ভিন্ন হতে পারে।

সমস্ত সাজেশনে একই ইনটেন্ট অ্যাকশন ব্যবহার করতে চান কিনা, তার উপর নির্ভর করে আপনি অ্যাকশনটি দুটি উপায়ে সংজ্ঞায়িত করতে পারেন:

  • সমস্ত সাজেশনের অ্যাকশন নির্ধারণ করতে আপনার সার্চেবল কনফিগারেশন ফাইলের android:searchSuggestIntentAction অ্যাট্রিবিউটটি ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
    <?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.MyCustomSuggestionProvider"
        android:searchSuggestIntentAction="android.intent.action.VIEW" >
    </searchable>
  • প্রতিটি সাজেশনের জন্য অ্যাকশন নির্ধারণ করতে SUGGEST_COLUMN_INTENT_ACTION কলামটি ব্যবহার করুন। এটি করার জন্য, আপনার সাজেশন টেবিলে SUGGEST_COLUMN_INTENT_ACTION কলামটি যোগ করুন এবং প্রতিটি সাজেশনের জন্য, এতে ব্যবহারযোগ্য অ্যাকশনটি রাখুন—যেমন "android.intent.action.VIEW"

আপনি এই দুটি কৌশল একত্রিতও করতে পারেন। উদাহরণস্বরূপ, আপনি ডিফল্টরূপে সমস্ত সাজেশনের জন্য একটি অ্যাকশন সহ android:searchSuggestIntentAction অ্যাট্রিবিউটটি অন্তর্ভুক্ত করতে পারেন, তারপর SUGGEST_COLUMN_INTENT_ACTION কলামে একটি ভিন্ন অ্যাকশন ঘোষণা করে কিছু সাজেশনের জন্য এই অ্যাকশনটিকে ওভাররাইড করতে পারেন। যদি আপনি SUGGEST_COLUMN_INTENT_ACTION কলামে কোনো মান অন্তর্ভুক্ত না করেন, তাহলে android:searchSuggestIntentAction অ্যাট্রিবিউটে দেওয়া ইন্টেন্টটি ব্যবহৃত হবে।

অভিপ্রায় ডেটা ঘোষণা করুন

যখন ব্যবহারকারী কোনো সাজেশন নির্বাচন করেন, তখন আপনার সার্চযোগ্য অ্যাক্টিভিটি আপনার সংজ্ঞায়িত অ্যাকশনসহ ইন্টেন্টটি গ্রহণ করে—যেমনটি পূর্ববর্তী বিভাগে আলোচনা করা হয়েছে—কিন্তু কোন সাজেশনটি নির্বাচন করা হয়েছে তা আপনার অ্যাক্টিভিটির শনাক্ত করার জন্য ইন্টেন্টটির সাথে অবশ্যই ডেটাও থাকতে হবে। বিশেষত, ডেটাটি প্রতিটি সাজেশনের জন্য অনন্য হতে হবে, যেমন আপনার SQLite টেবিলে সাজেশনটির রো আইডি। ইন্টেন্টটি গ্রহণ করার পর, আপনি getData() বা getDataString() ব্যবহার করে সংযুক্ত ডেটা পুনরুদ্ধার করতে পারেন।

আপনি ইন্টেন্টের অন্তর্ভুক্ত ডেটা দুটি উপায়ে সংজ্ঞায়িত করতে পারেন:

  • আপনার সাজেশন টেবিলের SUGGEST_COLUMN_INTENT_DATA কলামের মধ্যে প্রতিটি সাজেশনের জন্য ডেটা নির্ধারণ করুন।

    সাজেশন টেবিলে প্রতিটি ইন্টেন্টের জন্য প্রয়োজনীয় সমস্ত ডেটা তথ্য সরবরাহ করতে SUGGEST_COLUMN_INTENT_DATA কলামটি অন্তর্ভুক্ত করুন এবং প্রতিটি সারির জন্য এটিকে অনন্য ডেটা দিয়ে পূরণ করুন। এই কলামের ডেটা আপনি যেভাবে ইন্টেন্টটি সংজ্ঞায়িত করেন, ঠিক সেভাবেই এর সাথে সংযুক্ত হয়ে যায়। এরপর আপনি getData() বা getDataString() ব্যবহার করে এটি পুনরুদ্ধার করতে পারেন।

  • একটি ডেটা URI-কে দুটি অংশে বিভক্ত করুন: একটি অংশ যা সমস্ত সাজেশনের জন্য সাধারণ এবং অন্যটি যা প্রতিটি সাজেশনের জন্য স্বতন্ত্র। এই অংশগুলিকে যথাক্রমে সার্চেবল কনফিগারেশনের android:searchSuggestintentData অ্যাট্রিবিউটে এবং আপনার সাজেশন টেবিলের SUGGEST_COLUMN_INTENT_DATA_ID কলামে রাখুন।

    নিম্নলিখিত উদাহরণটি দেখায় কিভাবে আপনার সার্চেবল কনফিগারেশনের android:searchSuggestIntentData অ্যাট্রিবিউটে URI-এর সেই অংশটি ঘোষণা করতে হয় যা সমস্ত সাজেশনের জন্য সাধারণ:

      <?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.MyCustomSuggestionProvider"
          android:searchSuggestIntentAction="android.intent.action.VIEW"
          android:searchSuggestIntentData="content://com.example/datatable" >
      </searchable>
      

    আপনার সাজেশন টেবিলের SUGGEST_COLUMN_INTENT_DATA_ID কলামে প্রতিটি সাজেশনের চূড়ান্ত পাথ—অর্থাৎ অনন্য অংশটি—অন্তর্ভুক্ত করুন। যখন ব্যবহারকারী কোনো সাজেশন নির্বাচন করেন, তখন সিস্টেম android:searchSuggestIntentData থেকে স্ট্রিংটি নেয়, এর শেষে একটি স্ল্যাশ ( / ) যোগ করে এবং তারপর একটি সম্পূর্ণ কন্টেন্ট URI তৈরি করার জন্য SUGGEST_COLUMN_INTENT_DATA_ID কলাম থেকে সংশ্লিষ্ট মানটি যুক্ত করে। এরপর আপনি getData() ব্যবহার করে Uri টি পুনরুদ্ধার করতে পারবেন।

আরও ডেটা যোগ করুন

আপনার ইন্টেন্টের সাথে আরও তথ্য প্রকাশ করার প্রয়োজন হলে, আপনি SUGGEST_COLUMN_INTENT_EXTRA_DATA এর মতো আরেকটি টেবিল কলাম যোগ করতে পারেন, যা সাজেশনটি সম্পর্কে অতিরিক্ত তথ্য সংরক্ষণ করতে পারে। এই কলামে সংরক্ষিত ডেটা ইন্টেন্টের এক্সট্রা বান্ডেলের EXTRA_DATA_KEY তে রাখা হয়।

অভিপ্রায়টি সামলান।

কাস্টম ইন্টেন্ট ব্যবহার করে কাস্টম সার্চ সাজেশন দেওয়ার পরে, ব্যবহারকারী যখন কোনো সাজেশন নির্বাচন করেন, তখন আপনার সার্চেবল অ্যাক্টিভিটিকে সেই ইন্টেন্টগুলো হ্যান্ডেল করতে হবে। এটি ACTION_SEARCH ইন্টেন্ট হ্যান্ডেল করার অতিরিক্ত একটি কাজ, যা আপনার সার্চেবল অ্যাক্টিভিটি ইতিমধ্যেই করে থাকে। আপনার অ্যাক্টিভিটির onCreate() কলব্যাকে কীভাবে ইন্টেন্টগুলো হ্যান্ডেল করতে পারেন, তার একটি উদাহরণ নিচে দেওয়া হলো:

কোটলিন

when(intent.action) {
    Intent.ACTION_SEARCH -> {
        // Handle the normal search query case.
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doSearch(query)
        }
    }
    Intent.ACTION_VIEW -> {
        // Handle a suggestions click, because the suggestions all use ACTION_VIEW.
        showResult(intent.data)
    }
}

জাভা

Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    // Handle the normal search query case.
    String query = intent.getStringExtra(SearchManager.QUERY);
    doSearch(query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
    // Handle a suggestions click, because the suggestions all use ACTION_VIEW.
    Uri data = intent.getData();
    showResult(data);
}

এই উদাহরণে, ইন্টেন্ট অ্যাকশনটি হলো ACTION_VIEW এবং ডেটাটি একটি সম্পূর্ণ URI বহন করে যা প্রস্তাবিত আইটেমটিকে নির্দেশ করে, যা android:searchSuggestIntentData স্ট্রিং এবং SUGGEST_COLUMN_INTENT_DATA_ID কলাম দ্বারা সংশ্লেষিত হয়। এরপর URI-টি স্থানীয় showResult() মেথডে পাঠানো হয়, যা URI দ্বারা নির্দিষ্ট আইটেমটির জন্য কন্টেন্ট প্রোভাইডারকে কোয়েরি করে।

কোয়েরি টেক্সটটি পুনরায় লিখুন

ডিফল্টরূপে, যদি ব্যবহারকারী ট্র্যাকবল বা ডি-প্যাডের মতো দিকনির্দেশক কন্ট্রোল ব্যবহার করে সাজেশনের তালিকার মধ্যে দিয়ে যান, তাহলে কোয়েরি টেক্সট আপডেট হয় না। তবে, আপনি সাময়িকভাবে টেক্সট বক্সে থাকা ব্যবহারকারীর কোয়েরি টেক্সটটিকে ফোকাসে থাকা সাজেশনের সাথে মেলে এমন একটি কোয়েরি দিয়ে পুনরায় লিখতে পারেন। এর ফলে ব্যবহারকারী সাজেশন হিসেবে দেখানো কোয়েরিটি দেখতে পান এবং সার্চ হিসেবে পাঠানোর আগে সার্চ বক্সটি সিলেক্ট করে কোয়েরিটি এডিট করতে পারেন।

আপনি কোয়েরি টেক্সটটি নিম্নলিখিত উপায়ে পুনর্লিখন করতে পারেন:

  • আপনার সার্চেবল কনফিগারেশনে android:searchMode অ্যাট্রিবিউটটি "queryRewriteFromText" ভ্যালু সহ যোগ করুন। এক্ষেত্রে, সাজেশনের SUGGEST_COLUMN_TEXT_1 কলামের কন্টেন্ট ব্যবহার করে কোয়েরি টেক্সটটি রিরাইট করা হয়।
  • আপনার সার্চেবল কনফিগারেশনে "queryRewriteFromData" ভ্যালু সহ android:searchMode অ্যাট্রিবিউটটি যোগ করুন। এক্ষেত্রে, সাজেশনের SUGGEST_COLUMN_INTENT_DATA কলামের কন্টেন্ট ব্যবহার করে কোয়েরি টেক্সট রিরাইট করা হয়। এটি শুধুমাত্র সেইসব URI বা অন্যান্য ডেটা ফরম্যাটের সাথে ব্যবহার করুন যেগুলো ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার জন্য তৈরি, যেমন HTTP URL। এভাবে কোয়েরি রিরাইট করার জন্য অভ্যন্তরীণ URI স্কিম ব্যবহার করবেন না।
  • আপনার সাজেশন টেবিলের SUGGEST_COLUMN_QUERY কলামে একটি অনন্য কোয়েরি টেক্সট স্ট্রিং প্রদান করুন। যদি এই কলামটি উপস্থিত থাকে এবং বর্তমান সাজেশনের জন্য কোনো মান ধারণ করে, তবে এটি কোয়েরি টেক্সট পুনর্লিখন করতে এবং পূর্ববর্তী যেকোনো একটি বাস্তবায়নকে ওভাররাইড করতে ব্যবহৃত হয়।

কুইক সার্চ বক্সে সার্চ সাজেশনগুলো প্রদর্শন করুন।

একবার আপনি আপনার অ্যাপকে কাস্টম সার্চ সাজেশন দেখানোর জন্য কনফিগার করে নিলে, সেগুলোকে বিশ্বব্যাপী অ্যাক্সেসযোগ্য কুইক সার্চ বক্সে উপলব্ধ করাটা খুবই সহজ। এর জন্য আপনাকে শুধু আপনার সার্চেবল কনফিগারেশনটি পরিবর্তন করে android:includeInGlobalSearch "true" ভ্যালুসহ অন্তর্ভুক্ত করতে হবে।

একমাত্র যে পরিস্থিতিতে অতিরিক্ত কাজ করার প্রয়োজন হয়, তা হলো যখন আপনার কন্টেন্ট প্রোভাইডার রিড পারমিশন চায়। সেক্ষেত্রে, কুইক সার্চ বক্সকে আপনার কন্টেন্ট প্রোভাইডারে রিড অ্যাক্সেস দেওয়ার জন্য, প্রোভাইডারের জন্য একটি <path-permission> এলিমেন্ট যোগ করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<provider android:name="MySuggestionProvider"
          android:authorities="com.example.MyCustomSuggestionProvider"
          android:readPermission="com.example.provider.READ_MY_DATA"
          android:writePermission="com.example.provider.WRITE_MY_DATA">
  <path-permission android:pathPrefix="/search_suggest_query"
                   android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>

এই উদাহরণে, প্রোভাইডারটি কন্টেন্টে রিড এবং রাইট অ্যাক্সেস সীমাবদ্ধ করে। <path-permission> এলিমেন্টটি এই সীমাবদ্ধতা সংশোধন করে এবং যখন "android.permission.GLOBAL_SEARCH" পারমিশনটি বিদ্যমান থাকে, তখন "/search_suggest_query" পাথ প্রিফিক্সের ভেতরের কন্টেন্টে রিড অ্যাক্সেস প্রদান করে। এর ফলে কুইক সার্চ বক্স আপনার কন্টেন্ট প্রোভাইডার থেকে সাজেশনের জন্য কোয়েরি করতে পারে।

যদি আপনার কন্টেন্ট প্রোভাইডার পড়ার অনুমতি বলবৎ না করে, তাহলে কুইক সার্চ বক্স ডিফল্টরূপে তা পড়ে নেয়।

একটি ডিভাইসে সাজেশন চালু করুন

ডিফল্টরূপে, অ্যাপগুলি কুইক সার্চ বক্সে সাজেশন দেখানোর জন্য সক্ষম থাকে না, এমনকি যদি সেভাবে কনফিগার করাও থাকে। ব্যবহারকারী সেটিংস > সার্চ -এ অবস্থিত সার্চেবল আইটেমস খুলে এবং আপনার অ্যাপটিকে একটি সার্চেবল আইটেম হিসেবে সক্ষম করার মাধ্যমে কুইক সার্চ বক্সে আপনার অ্যাপের সাজেশন অন্তর্ভুক্ত করবেন কিনা তা বেছে নিতে পারেন।

কুইক সার্চ বক্সে উপলব্ধ প্রতিটি অ্যাপের জন্য সার্চযোগ্য আইটেম সেটিংস পৃষ্ঠায় একটি এন্ট্রি থাকে। এই এন্ট্রিতে অ্যাপটির নাম এবং অ্যাপটি থেকে কোন কন্টেন্ট অনুসন্ধান করা যাবে ও কুইক সার্চ বক্সে সাজেশনের জন্য উপলব্ধ হবে, তার একটি সংক্ষিপ্ত বিবরণ অন্তর্ভুক্ত থাকে। আপনার অনুসন্ধানযোগ্য অ্যাপের জন্য বিবরণের টেক্সট নির্ধারণ করতে, আপনার অনুসন্ধানযোগ্য কনফিগারেশনে android:searchSettingsDescription অ্যাট্রিবিউটটি যোগ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<?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.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:includeInGlobalSearch="true"
    android:searchSettingsDescription="@string/search_description" >
</searchable>

android:searchSettingsDescription জন্য স্ট্রিংটি যতটা সম্ভব সংক্ষিপ্ত করুন এবং যে বিষয়বস্তু অনুসন্ধানযোগ্য তা উল্লেখ করুন। উদাহরণস্বরূপ, একটি মিউজিক অ্যাপের জন্য "শিল্পী, অ্যালবাম এবং ট্র্যাক", অথবা একটি নোটপ্যাড অ্যাপের জন্য "সংরক্ষিত নোট"। এই বিবরণটি প্রদান করা গুরুত্বপূর্ণ, যাতে ব্যবহারকারী জানতে পারে কী ধরনের পরামর্শ দেওয়া হচ্ছে। যখন android:includeInGlobalSearch মান true হবে, তখন সর্বদা এই অ্যাট্রিবিউটটি অন্তর্ভুক্ত করুন।

যেহেতু আপনার অ্যাপের জন্য সার্চ সাজেশন চালু করতে ব্যবহারকারীকে সেটিংস মেনুতে যেতে হয়, তাই সার্চ যদি আপনার অ্যাপের একটি গুরুত্বপূর্ণ দিক হয়, তবে তা ব্যবহারকারীদের কাছে কীভাবে তুলে ধরবেন তা বিবেচনা করুন। উদাহরণস্বরূপ, কোনো ব্যবহারকারী প্রথমবার অ্যাপটি চালু করার সময় আপনি একটি নোট দিতে পারেন, যেখানে কুইক সার্চ বক্সের জন্য সার্চ সাজেশন কীভাবে চালু করতে হয় তা ব্যাখ্যা করা থাকবে।

কুইক সার্চ বক্সের সাজেশন শর্টকাটগুলো পরিচালনা করুন

ব্যবহারকারী কুইক সার্চ বক্স থেকে যে সাজেশনগুলো নির্বাচন করেন, সেগুলোকে স্বয়ংক্রিয়ভাবে শর্টকাটে পরিণত করা যেতে পারে। এই সাজেশনগুলো সিস্টেম আপনার কন্টেন্ট প্রোভাইডার থেকে কপি করে রাখে, যাতে আপনার কন্টেন্ট প্রোভাইডারকে পুনরায় কোয়েরি না করেই এটি দ্রুত সাজেশনটি অ্যাক্সেস করতে পারে।

ডিফল্টরূপে, কুইক সার্চ বক্স দ্বারা প্রাপ্ত সমস্ত সাজেশনের জন্য এটি সক্রিয় থাকে, কিন্তু সময়ের সাথে সাথে যদি আপনার সাজেশনের ডেটা পরিবর্তিত হয়, তাহলে আপনি শর্টকাটগুলো রিফ্রেশ করার জন্য অনুরোধ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার সাজেশনগুলো কোনো কন্ট্যাক্টের উপস্থিতি স্ট্যাটাসের মতো ডাইনামিক ডেটা নির্দেশ করে, তাহলে ব্যবহারকারীকে দেখানোর সময় সাজেশন শর্টকাটগুলো রিফ্রেশ করার জন্য অনুরোধ করুন। এটি করার জন্য, আপনার সাজেশন টেবিলে SUGGEST_COLUMN_SHORTCUT_ID অন্তর্ভুক্ত করুন। আপনি নিম্নলিখিত উপায়গুলোর মধ্যে যেকোনো একটিতে প্রতিটি সাজেশনের জন্য শর্টকাটের আচরণ কনফিগার করতে এই কলামটি ব্যবহার করতে পারেন:

  • সাজেশন শর্টকাটের একটি নতুন সংস্করণের জন্য কুইক সার্চ বক্সকে আপনার কন্টেন্ট প্রোভাইডারকে পুনরায় কোয়েরি করতে বলুন।

    প্রতিবার শর্টকাটটি প্রদর্শিত হওয়ার সময় সাজেশনটির একটি নতুন সংস্করণের জন্য পুনরায় কোয়েরি করার জন্য SUGGEST_COLUMN_SHORTCUT_ID কলামে একটি মান প্রদান করুন। রিফ্রেশ কোয়েরিটি রিটার্ন না করা পর্যন্ত শর্টকাটটি সর্বশেষ উপলব্ধ ডেটা সহ দ্রুত প্রদর্শিত হয়, এবং রিফ্রেশ কোয়েরিটি রিটার্ন করার পর সাজেশনটি নতুন তথ্য দিয়ে রিফ্রেশ করা হয়। রিফ্রেশ কোয়েরিটি SUGGEST_URI_PATH_SHORTCUT এর পরিবর্তে SUGGEST_URI_PATH_QUERY এর একটি URI পাথ সহ আপনার কন্টেন্ট প্রোভাইডারের কাছে পাঠানো হয়।

    আপনি Cursor ফেরত দেবেন, তাতে মূল সাজেশনের মতো একই কলাম ব্যবহার করে একটি সাজেশন রাখুন অথবা এটিকে খালি রাখুন, যা নির্দেশ করে যে শর্টকাটটি আর বৈধ নয়—সেক্ষেত্রে, সাজেশনটি অদৃশ্য হয়ে যায় এবং শর্টকাটটি মুছে ফেলা হয়।

    যদি কোনো সাজেশন এমন ডেটার সাথে সম্পর্কিত হয় যা রিফ্রেশ হতে বেশি সময় নিতে পারে, যেমন নেটওয়ার্ক-ভিত্তিক রিফ্রেশ, তাহলে রিফ্রেশ সম্পূর্ণ না হওয়া পর্যন্ত ডানদিকের আইকনের জন্য একটি প্রোগ্রেস স্পিনার দেখানোর জন্য আপনি আপনার সাজেশন টেবিলে SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING কলামটি 'true' ভ্যালু দিয়ে যোগ করতে পারেন। 'true' ছাড়া অন্য কোনো ভ্যালু দিলে প্রোগ্রেস স্পিনারটি দেখানো হয় না।

  • সাজেশনটি যাতে কোনোভাবেই শর্টকাটে কপি না হয়, তা নিশ্চিত করুন।

    SUGGEST_COLUMN_SHORTCUT_ID কলামে SUGGEST_NEVER_MAKE_SHORTCUT ভ্যালুটি দিন। এক্ষেত্রে, সাজেশনটি কখনোই শর্টকাটে কপি করা হবে না। এটি শুধুমাত্র তখনই প্রয়োজন, যদি আপনি একেবারেই না চান যে পূর্বে কপি করা সাজেশনটি প্রদর্শিত হোক। যদি আপনি কলামটির জন্য একটি সাধারণ ভ্যালু দেন, তাহলে সাজেশন শর্টকাটটি শুধুমাত্র রিফ্রেশ কোয়েরি রিটার্ন করা পর্যন্তই প্রদর্শিত হবে।

  • ডিফল্ট শর্টকাট আচরণটি প্রযোজ্য হোক।

    যেসব সাজেশন পরিবর্তন হয় না এবং শর্টকাট হিসেবে সংরক্ষণ করা যায়, সেগুলোর জন্য SUGGEST_COLUMN_SHORTCUT_ID খালি রাখুন।

যদি আপনার কোনো সাজেশন কখনো পরিবর্তন না হয়, তাহলে আপনার SUGGEST_COLUMN_SHORTCUT_ID কলামটির প্রয়োজন নেই।

কুইক সার্চ বক্স সাজেশনের র‍্যাঙ্কিং সম্পর্কে

একবার আপনি কুইক সার্চ বক্সে আপনার অ্যাপের সার্চ সাজেশনগুলো উপলব্ধ করলে, কুইক সার্চ বক্সের র‍্যাঙ্কিং নির্ধারণ করে যে একটি নির্দিষ্ট কোয়েরির জন্য সাজেশনগুলো ব্যবহারকারীর কাছে কীভাবে প্রদর্শিত হবে। এটি নির্ভর করতে পারে সেই কোয়েরির জন্য অন্য কতগুলো অ্যাপে ফলাফল রয়েছে এবং ব্যবহারকারী অন্যান্য অ্যাপের ফলাফলের তুলনায় আপনার ফলাফলগুলো কত ঘন ঘন বেছে নেয় তার উপর। আপনার সাজেশনগুলো কীভাবে র‍্যাঙ্ক করা হবে বা একটি নির্দিষ্ট কোয়েরির জন্য আপনার অ্যাপের সাজেশনগুলো আদৌ দেখানো হবে কিনা, সে বিষয়ে কোনো নিশ্চয়তা নেই। সাধারণভাবে, উন্নত মানের ফলাফল প্রদান করলে আপনার অ্যাপের সাজেশনগুলো একটি গুরুত্বপূর্ণ অবস্থানে প্রদর্শিত হওয়ার সম্ভাবনা বাড়ে, এবং যে অ্যাপগুলো নিম্নমানের সাজেশন প্রদান করে, সেগুলোর র‍্যাঙ্ক নিচে হওয়ার বা প্রদর্শিত না হওয়ার সম্ভাবনা বেশি থাকে।