কাস্টম সার্চ সাজেশন যোগ করুন

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

আপনি 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
    }
}

জাভা

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

জাভা

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

জাভা

@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()

জাভা

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

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