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

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

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

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

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

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

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

সাম্প্রতিক অনুসন্ধানের পরামর্শ প্রদান করতে, আপনাকে যা করতে হবে তা হলো:

  • একটি অনুসন্ধানযোগ্য কার্যকলাপ বাস্তবায়ন করুন।
  • একটি কন্টেন্ট প্রোভাইডার তৈরি করুন যা SearchRecentSuggestionsProvider এক্সটেন্ড করে এবং আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে এটি ডিক্লেয়ার করুন।
  • যে কন্টেন্ট প্রোভাইডার অনুসন্ধানের পরামর্শ দেয়, তার তথ্য দিয়ে অনুসন্ধানযোগ্য কনফিগারেশনটি পরিবর্তন করুন।
  • প্রতিবার অনুসন্ধান চালানোর সময় আপনার কন্টেন্ট প্রোভাইডারে কোয়েরিগুলো সংরক্ষণ করুন।

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

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

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

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

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

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

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

সাম্প্রতিক কোয়েরি সাজেশনের জন্য আপনার যে কন্টেন্ট প্রোভাইডারটি প্রয়োজন, তা হলো SearchRecentSuggestionsProvider এর একটি ইমপ্লিমেন্টেশন। এই ক্লাসটি আপনার জন্য সবকিছু করে দেয়। আপনাকে শুধু একটি ক্লাস কনস্ট্রাক্টর লিখতে হবে যা এক লাইনের কোড এক্সিকিউট করে।

উদাহরণস্বরূপ, সাম্প্রতিক কোয়েরি সাজেশনের জন্য একটি কন্টেন্ট প্রোভাইডারের সম্পূর্ণ বাস্তবায়ন নিচে দেওয়া হলো:

কোটলিন

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

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

জাভা

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 অন্তর্ভুক্ত করা যেতে পারে, যা সাজেশন টেবিলে একটি কলাম যোগ করে, ফলে আপনি প্রতিটি সাজেশনের সাথে দ্বিতীয় লাইনের টেক্সট প্রদান করতে পারেন। আপনি যদি প্রতিটি সাজেশনে দুটি লাইন প্রদান করতে চান, তাহলে নিম্নলিখিত উদাহরণটি দেখুন:

কোটলিন

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

জাভা

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() মেথডের সময় আপনি যেভাবে কোয়েরিটি সংরক্ষণ করতে পারেন তা নিচে দেওয়া হলো:

কোটলিন

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)
        }
    }
}

জাভা

@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() কল করুন। উদাহরণস্বরূপ:

কোটলিন

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

জাভা

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

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