সার্চ ইন্টারফেস তৈরি করা

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

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

সার্চ ডায়ালগ ও উইজেটের জন্য উপলভ্য অন্যান্য ফিচারের মধ্যে রয়েছে:

  • ভয়েস সার্চ
  • সাম্প্রতিক কোয়েরির উপর ভিত্তি করে সার্চ সাজেশন
  • আপনার অ্যাপ ডেটায় আসল ফলাফলের সাথে মেলে এমন সার্চ সাজেশন

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

সম্পর্কিত রিসোর্স:

প্রাথমিক বিষয়

শুরু করার আগে, সার্চ ডায়ালগ বা সার্চ উইজেট ব্যবহার করে আপনার সার্চ ইন্টারফেস প্রয়োগ করতে চান কিনা তা ঠিক করুন। এগুলি একই সার্চ ফিচার প্রদান করে, তবে কিছুটা ভিন্ন উপায়ে:

  • সার্চ ডায়ালগ হল একটি UI কম্পোনেন্ট যা Android সিস্টেমের মাধ্যমে নিয়ন্ত্রিত হয়। ব্যবহারকারী চালু করলে, অ্যাক্টিভিটির সবচেয়ে উপরে সার্চ ডায়ালগ দেখা যায়।

    Android সিস্টেম সার্চ ডায়ালগের সব ইভেন্ট নিয়ন্ত্রণ করে। ব্যবহারকারী কোনও কোয়েরি জমা দিলে, সিস্টেম সেই কোয়েরিটি সেই অ্যাক্টিভিটিতে পাঠায় যা আপনি সার্চ ম্যানেজ করার জন্য নির্দিষ্ট করেন। ব্যবহারকারী টাইপ করার সময় ডায়ালগ সার্চ সাজেশনও প্রদান করতে পারে।

  • সার্চ উইজেট হল SearchView-এর একটি ইনস্ট্যান্স যা আপনি আপনার লেআউটের যেকোনও জায়গায় রাখতে পারেন। ডিফল্ট হিসেবে, সার্চ উইজেট স্ট্যান্ডার্ড EditText উইজেটের মতো কাজ করে এবং কিছু করে না, তবে আপনি এটি কনফিগার করতে পারেন যাতে Android সিস্টেম সব ইনপুট ইভেন্ট ম্যানেজ করে, উপযুক্ত অ্যাক্টিভিটিতে কোয়েরি ডেলিভার করে এবং সার্চ সাজেশন প্রদান করে—ঠিক সার্চ ডায়ালগের মতো।

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

  • সার্চ কনফিগারেশন
    একটি XML ফাইল যা সার্চ ডায়ালগ বা উইজেটের জন্য কিছু সেটিংস কনফিগার করে। এতে ভয়েস সার্চ, সার্চ সাজেশন ও সার্চ বক্সের জন্য হিন্ট টেক্সটের মতো ফিচারের সেটিংস অন্তর্ভুক্ত থাকে।
  • সার্চ করা যায় এমন অ্যাক্টিভিটি
    Activity যা সার্চ কোয়েরি গ্রহণ করে, আপনার ডেটা সার্চ করে এবং সার্চ ফলাফল দেখায়।
  • একটি সার্চ ইন্টারফেস, যা নিম্নলিখিতগুলির মধ্যে যেকোনও একটির মাধ্যমে প্রদান করা হয়:
    • সার্চ ডায়ালগ
      ডিফল্ট হিসেবে, সার্চ ডায়ালগ লুকানো থাকে। ব্যবহারকারী আপনার Search বোতামে ট্যাপ করলে, আপনি onSearchRequested() কল করার সময় এটি স্ক্রিনের সবচেয়ে উপরে দেখা যায়।
    • একটি SearchView উইজেট
      সার্চ উইজেট ব্যবহার করে আপনি সার্চ বক্সকে আপনার অ্যাক্টিভিটির যেকোনও জায়গায় রাখতে পারবেন, যার মধ্যে অ্যাপ বারে অ্যাকশন ভিউ হিসেবেও রাখা যায়।

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

সার্চ করা যায় এমন কনফিগারেশন তৈরি করুন

প্রথমে আপনার একটি XML ফাইল প্রয়োজন হবে, যাকে সার্চ কনফিগারেশন বলা হয়। এটি সার্চ ডায়ালগ বা উইজেটের নির্দিষ্ট কিছু UI দিক কনফিগার করে এবং সাজেশন ও ভয়েস সার্চের মতো ফিচার কীভাবে কাজ করবে তা নির্ধারণ করে। এই ফাইলটি সাধারণত searchable.xml নামে পরিচিত এবং এটি অবশ্যই res/xml/ প্রোজেক্ট ডিরেক্টরিতে সেভ করতে হবে।

সার্চ কনফিগারেশন ফাইলে অবশ্যই <searchable> এলিমেন্টকে রুট নোড হিসেবে অন্তর্ভুক্ত করতে হবে এবং এক বা একাধিক অ্যাট্রিবিউট নির্দিষ্ট করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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

android:label অ্যাট্রিবিউট হল একমাত্র প্রয়োজনীয় অ্যাট্রিবিউট। এটি একটি স্ট্রিং রিসোর্সকে নির্দেশ করে, যা অবশ্যই অ্যাপের নাম হতে হবে। আপনি কুইক সার্চ বক্সের জন্য সার্চ সাজেশন চালু না করা পর্যন্ত ব্যবহারকারী এই লেবেল দেখতে পাবেন না। চালু করার পরে, সিস্টেম সেটিংসে সার্চ করা যায় এমন আইটেমের তালিকায় লেবেলটি দেখা যাবে।

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

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

সার্চ করা যায় এমন অ্যাক্টিভিটি তৈরি করুন

সার্চ করা যায় এমন অ্যাক্টিভিটি হল আপনার অ্যাপের Activity যা কোয়েরি স্ট্রিংয়ের উপর ভিত্তি করে সার্চ করে এবং সার্চ ফলাফল দেখায়।

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

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

সার্চ করা যায় এমন অ্যাক্টিভিটি ঘোষণা করা

আপনার কাছে আগে থেকে না থাকলে, এমন একটি Activity তৈরি করুন যা সার্চ করে এবং ফলাফল দেখায়। আপনাকে এখনও সার্চ কার্যকারিতা প্রয়োগ করতে হবে না—শুধু একটি অ্যাক্টিভিটি তৈরি করুন যা আপনি ম্যানিফেস্টে ঘোষণা করতে পারবেন। ম্যানিফেস্টের <activity> এলিমেন্টের মধ্যে, নিম্নলিখিতগুলি করুন:

  1. ACTION_SEARCH ইনটেন্ট গ্রহণ করার জন্য অ্যাক্টিভিটি ঘোষণা করুন <intent-filter> এলিমেন্টে।
  2. <meta-data> এলিমেন্টে ব্যবহার করার জন্য সার্চ কনফিগারেশন নির্দিষ্ট করুন।

এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<application ... >
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>

<meta-data> এলিমেন্টে অবশ্যই android:name অ্যাট্রিবিউট থাকতে হবে যার ভ্যালু হবে "android.app.searchable" এবং android:resource অ্যাট্রিবিউট থাকতে হবে যার রেফারেন্স হবে সার্চ করা যায় এমন কনফিগারেশন ফাইল। আগের উদাহরণে, এটি res/xml/searchable.xml ফাইলকে বোঝায়।

সার্চ করা

ম্যানিফেস্টে আপনার সার্চযোগ্য অ্যাক্টিভিটি ঘোষণা করার পরে, আপনার সার্চযোগ্য অ্যাক্টিভিটিতে সার্চ করার জন্য এই পদ্ধতি অনুসরণ করুন:

  1. কোয়েরি পাওয়া।
  2. আপনার ডেটা সার্চ করুন।
  3. ফলাফল দেখান।

কোয়েরি পাওয়া

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

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.search)

    // Verify the action and get the query.
    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doMySearch(query)
        }
    }
}

জাভা

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action, and get the query.
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

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

আপনার ডেটা সার্চ করুন

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

  • আপনার ডেটা ডিভাইসের SQLite ডেটাবেসে স্টোর করা থাকলে, সম্পূর্ণ টেক্সট সার্চ—LIKE কোয়েরির পরিবর্তে FTS3 ব্যবহার করে—টেক্সট ডেটা জুড়ে আরও শক্তিশালী সার্চ প্রদান করতে পারে এবং উল্লেখযোগ্যভাবে দ্রুত ফলাফল দেখাতে পারে। FTS3 সম্পর্কে তথ্য পেতে sqlite.org দেখুন এবং Android-এ SQLite সম্পর্কে তথ্য পেতে SQLiteDatabase ক্লাস দেখুন।
  • আপনার ডেটা অনলাইনে স্টোর করা থাকলে, ব্যবহারকারীর ডেটা কানেকশনের কারণে সার্চের পারফর্ম্যান্সের উপর প্রভাব পড়তে পারে। সার্চের ফলাফল না পাওয়া পর্যন্ত আপনি হয়ত প্রোগ্রেস ইন্ডিকেটর দেখাতে চাইবেন। নেটওয়ার্ক API-এর রেফারেন্সের জন্য android.net এবং কীভাবে প্রগ্রেস ইন্ডিকেটর দেখাতে হয় সেই সম্পর্কে তথ্যের জন্য ProgressBar দেখুন।

ফলাফল দেখান

আপনার ডেটা যেখানেই থাকুক এবং আপনি যেভাবে সার্চ করুন না কেন, আমরা সাজেস্ট করি যে আপনি Adapter-এর মাধ্যমে আপনার সার্চ করা যায় এমন অ্যাক্টিভিটিতে সার্চ ফলাফল ফিরিয়ে আনুন। এইভাবে, আপনি সব সার্চ ফলাফল একটি RecyclerView-এ দেখাতে পারবেন। আপনার ডেটা SQLite ডেটাবেস কোয়েরি থেকে এলে, আপনি CursorAdapter ব্যবহার করে RecyclerView-এ আপনার ফলাফল প্রয়োগ করতে পারবেন। আপনার ডেটা অন্য ফর্ম্যাটে থাকলে, আপনি BaseAdapter-এর এক্সটেনশন তৈরি করতে পারবেন।

Adapter ডেটার সেট থেকে প্রতিটি আইটেমকে একটি View অবজেক্টে বাইন্ড করে। RecyclerView-এ Adapter প্রয়োগ করা হলে, প্রতিটি ডেটা তালিকায় স্বতন্ত্র ভিউ হিসেবে যোগ করা হয়। Adapter হল শুধুমাত্র একটি ইন্টারফেস, তাই CursorAdapter-এর মতো ইমপ্লিমেন্টেশন—যা Cursor থেকে ডেটা বাইন্ড করার জন্য— প্রয়োজন। আগে থেকে থাকা কোনও ইমপ্লিমেন্টেশন আপনার ডেটার জন্য কাজ না করলে, আপনি BaseAdapter থেকে নিজের ইমপ্লিমেন্টেশন করতে পারবেন।

সার্চ ডায়ালগ ব্যবহার করুন

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

ডিফল্ট হিসেবে, ব্যবহারকারী চালু না করা পর্যন্ত সার্চ ডায়ালগ সবসময় লুকানো থাকে। আপনার অ্যাপ onSearchRequested()-এ কল করে সার্চ ডায়ালগ অ্যাক্টিভেট করতে পারে। তবে, আপনি অ্যাক্টিভিটির জন্য সার্চ ডায়ালগ চালু না করা পর্যন্ত এই পদ্ধতি কাজ করে না।

সার্চ করার জন্য সার্চ ডায়ালগ চালু করতে, সিস্টেমকে নির্দেশ করুন যে কোন সার্চযোগ্য অ্যাক্টিভিটি সার্চ ডায়ালগ থেকে সার্চ কোয়েরি গ্রহণ করবে। যেমন, সার্চ করা যায় এমন অ্যাক্টিভিটি তৈরি করা সম্পর্কে আগের বিভাগে, SearchableActivity নামের সার্চ করা যায় এমন অ্যাক্টিভিটি তৈরি করা হয়েছে। আপনি যদি চান যে সার্চ ডায়ালগ দেখানোর জন্য এবং SearchableActivity-এ সার্চ ডেলিভার করার জন্য OtherActivity-এর মতো কোনও আলাদা অ্যাক্টিভিটি থাকুক, তাহলে ম্যানিফেস্টে ঘোষণা করুন যে OtherActivity-এ সার্চ ডায়ালগের জন্য ব্যবহার করার মতো সার্চযোগ্য অ্যাক্টিভিটি হল SearchableActivity।

কোনও অ্যাক্টিভিটির সার্চ ডায়ালগের জন্য সার্চ করা যায় এমন অ্যাক্টিভিটি ঘোষণা করতে, সংশ্লিষ্ট অ্যাক্টিভিটির <activity> এলিমেন্টের মধ্যে একটি <meta-data> এলিমেন্ট যোগ করুন। <meta-data> এলিমেন্টে অবশ্যই android:value অ্যাট্রিবিউট থাকতে হবে যা সার্চ করা যায় এমন অ্যাক্টিভিটির ক্লাস নাম এবং android:name অ্যাট্রিবিউট "android.app.default_searchable" ভ্যালু সহ নির্দিষ্ট করে।

যেমন, এখানে সার্চ করা যায় এমন অ্যাক্টিভিটি, SearchableActivity এবং অন্য অ্যাক্টিভিটি, OtherActivity, যেটি SearchableActivity ব্যবহার করে সার্চ ডায়ালগ থেকে সার্চ করে, দুটিরই ঘোষণা দেওয়া হল:

<application ... >
    <!-- This is the searchable activity; it performs searches. -->
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>

    <!-- This activity enables the search dialog to initiate searches
         in the SearchableActivity. -->
    <activity android:name=".OtherActivity" ... >
        <!-- Enable the search dialog to send searches to SearchableActivity. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" />
    </activity>
    ...
</application>

কারণ OtherActivity-এ এখন একটি <meta-data> এলিমেন্ট অন্তর্ভুক্ত আছে যা সার্চের জন্য কোন সার্চযোগ্য অ্যাক্টিভিটি ব্যবহার করতে হবে তা ঘোষণা করে, অ্যাক্টিভিটি সার্চ ডায়ালগ চালু করে। যদিও ব্যবহারকারী এই অ্যাক্টিভিটিতে রয়েছেন, onSearchRequested() পদ্ধতি সার্চ ডায়ালগ অ্যাক্টিভেট করে। ব্যবহারকারী সার্চ করলে, সিস্টেম শুরু হয় SearchableActivity এবং এটি ACTION_SEARCH ইনটেন্ট ডেলিভার করে।

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

আপনার অ্যাক্টিভিটির জন্য সার্চ ডায়ালগ এখন চালু করা হয়েছে, আপনার অ্যাপ সার্চ করার জন্য প্রস্তুত।

সার্চ ডায়ালগ চালু করুন

যদিও কিছু ডিভাইসে একটি নির্দিষ্ট সার্চ বোতাম থাকে, তবে বোতামের আচরণ ডিভাইসগুলির মধ্যে পরিবর্তিত হতে পারে এবং অনেক ডিভাইসে কোনও সার্চ বোতাম থাকে না। তাই সার্চ ডায়ালগ ব্যবহার করার সময়, আপনার UI-তে অবশ্যই একটি সার্চ বোতাম দিতে হবে যা onSearchRequested() কল করার মাধ্যমে সার্চ ডায়ালগ অ্যাক্টিভেট করে।

যেমন, আপনার বিকল্পের মেনু বা UI লেআউটে একটি সার্চ বোতাম যোগ করুন যা onSearchRequested() কল করে।

এছাড়াও, আপনি "টাইপ-টু-সার্চ" কার্যকারিতা চালু করতে পারেন, যা ব্যবহারকারী কীবোর্ডে টাইপ করা শুরু করলে সার্চ ডায়ালগ সক্রিয় করে। সার্চ ডায়ালগে কিস্ট্রোক যোগ করা হয়েছে। আপনি নিজের অ্যাক্টিভিটিতে টাইপ-টু-সার্চ চালু করতে পারেন setDefaultKeyMode—অথবা DEFAULT_KEYS_SEARCH_LOCAL—কল করে আপনার অ্যাক্টিভিটির onCreate() পদ্ধতির সময়।

আপনার অ্যাক্টিভিটি লাইফসাইকেলে সার্চ ডায়ালগের প্রভাব

সার্চ ডায়ালগ হল একটি Dialog যা স্ক্রিনের উপরে ভেসে থাকে। এটি অ্যাক্টিভিটি স্ট্যাকে কোনও পরিবর্তন করে না, তাই সার্চ ডায়ালগ দেখা গেলে, কোনও লাইফসাইকেল পদ্ধতি—যেমন onPause()—কল করা হয় না। আপনার অ্যাক্টিভিটি ইনপুট ফোকাস হারিয়েছে, কারণ ইনপুট ফোকাস সার্চ ডায়ালগে দেওয়া হয়েছে।

সার্চ ডায়ালগ অ্যাক্টিভেট করা হলে আপনি বিজ্ঞপ্তি পেতে চাইলে, onSearchRequested() পদ্ধতি ওভাররাইড করুন। সিস্টেম এই পদ্ধতি কল করলে, এটি ইঙ্গিত দেয় যে আপনার অ্যাক্টিভিটি সার্চ ডায়ালগে ইনপুট ফোকাস হারিয়েছে, তাই আপনি ইভেন্টের জন্য উপযুক্ত যেকোনও কাজ করতে পারেন, যেমন গেম পজ করা। আপনি সার্চ কনটেক্সট ডেটা পাস না করলে—এই ডকুমেন্টের অন্য বিভাগে আলোচনা করা হয়েছে—সুপারক্লাস ইমপ্লিমেন্টেশন কল করে মেথড শেষ করুন:

Kotlin

override fun onSearchRequested(): Boolean {
    pauseSomeStuff()
    return super.onSearchRequested()
}

জাভা

@Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}

ব্যবহারকারী 'ফিরে যান' বোতামে ট্যাপ করে সার্চ বাতিল করলে, সার্চ ডায়ালগ বন্ধ হয়ে যায় এবং অ্যাক্টিভিটি ইনপুট ফোকাস ফিরে পায়। আপনি বিজ্ঞপ্তি পাওয়ার জন্য রেজিস্টার করতে পারবেন যখন সার্চ ডায়ালগ বন্ধ করা হয় setOnDismissListener(), setOnCancelListener(), অথবা দুটির সাথেই। আপনাকে শুধু OnDismissListener রেজিস্টার করতে হবে, কারণ সার্চ ডায়ালগ বন্ধ হওয়ার সময় প্রতিবার এটি কল করা হয়। OnCancelListener শুধুমাত্র সেইসব ইভেন্টের ক্ষেত্রে প্রযোজ্য যেখানে ব্যবহারকারী স্পষ্টভাবে সার্চ ডায়ালগ থেকে বেরিয়ে আসেন, তাই সার্চ করা হলে এটি কল করা হয় না। সার্চ করা হয়ে গেলে, সার্চ ডায়ালগ অটোমেটিক অদৃশ্য হয়ে যায়।

বর্তমান অ্যাক্টিভিটি যদি সার্চযোগ্য অ্যাক্টিভিটি না হয়, তাহলে ব্যবহারকারী সার্চ করলে সাধারণ অ্যাক্টিভিটি লাইফসাইকেল ইভেন্ট ট্রিগার হয়—বর্তমান অ্যাক্টিভিটি onPause() পায়, যেমন অ্যাক্টিভিটির ভূমিকাতে বর্ণনা করা হয়েছে। তবে, বর্তমান অ্যাক্টিভিটি যদি সার্চ করা যায় এমন অ্যাক্টিভিটি হয়, তাহলে এই দুটির মধ্যে একটি ঘটনা ঘটে:

  • ডিফল্ট হিসেবে, সার্চ করা যায় এমন অ্যাক্টিভিটি ACTION_SEARCH ইনটেন্ট পায়, যার সাথে onCreate()-এ কল করা হয়, এবং অ্যাক্টিভিটির একটি নতুন ইনস্ট্যান্স অ্যাক্টিভিটি স্ট্যাকের সবচেয়ে উপরে নিয়ে আসা হয়। অ্যাক্টিভিটি স্ট্যাকে এখন আপনার সার্চযোগ্য অ্যাক্টিভিটির দুটি ইনস্ট্যান্স আছে, তাই 'ফিরে যান' বোতামে ট্যাপ করলে আপনি সার্চযোগ্য অ্যাক্টিভিটি থেকে বেরিয়ে যাওয়ার পরিবর্তে সার্চযোগ্য অ্যাক্টিভিটির আগের ইনস্ট্যান্সে ফিরে যাবেন।
  • আপনি android:launchMode-কে "singleTop"-এ সেট করলে, সার্চ করা যায় এমন অ্যাক্টিভিটি ACTION_SEARCH ইনটেন্ট পায় এবং onNewIntent(Intent)-এ কল করে নতুন ACTION_SEARCH ইনটেন্ট পাস করে। যেমন, এখানে দেখানো হয়েছে যে আপনি কীভাবে এই পরিস্থিতি সামলাতে পারেন, যেখানে সার্চযোগ্য অ্যাক্টিভিটির লঞ্চ মোড হল "singleTop":

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.search)
        handleIntent(intent)
    }
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }
    
    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            intent.getStringExtra(SearchManager.QUERY)?.also { query ->
                doMySearch(query)
            }
        }
    }

    জাভা

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        handleIntent(getIntent());
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }
    
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    সার্চ করা সংক্রান্ত বিভাগে দেওয়া স্যাম্পেল কোডের তুলনায়, সার্চ করার উদ্দেশ্য ম্যানেজ করার সব কোড এখন handleIntent() পদ্ধতিতে রয়েছে, যাতে onCreate() ও onNewIntent(), দুটিই এটি এক্সিকিউট করতে পারে।

    সিস্টেম onNewIntent(Intent) কল করলে, অ্যাক্টিভিটি রিস্টার্ট হয় না, তাই getIntent() পদ্ধতি onCreate()-এর সাথে পাওয়া একই ইনটেন্ট ফিরিয়ে দেয়। এই কারণে আপনাকে অবশ্যই onNewIntent(Intent)-এর মধ্যে setIntent(Intent) কল করতে হবে: যাতে ভবিষ্যতে আপনি getIntent() কল করলে অ্যাক্টিভিটির মাধ্যমে সেভ করা ইনটেন্ট আপডেট করা হয়।

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

<activity android:name=".SearchableActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
          android:name="android.app.searchable"
          android:resource="@xml/searchable"/>
  </activity>

সার্চ প্রসঙ্গ ডেটা পাস করে

কিছু ক্ষেত্রে, আপনি প্রতিটি সার্চের জন্য সার্চযোগ্য অ্যাক্টিভিটির মধ্যে সার্চ কোয়েরিতে প্রয়োজনীয় পরিবর্তন করতে পারেন। তবে, ব্যবহারকারী যে অ্যাক্টিভিটি থেকে সার্চ করছেন তার উপর ভিত্তি করে আপনি সার্চের মাপকাঠি আরও নিখুঁত করতে চাইলে, সিস্টেম আপনার সার্চযোগ্য অ্যাক্টিভিটিতে যে ইনটেন্ট পাঠায় তাতে অতিরিক্ত ডেটা প্রদান করতে পারেন। আপনি অতিরিক্ত ডেটা APP_DATA Bundle-এ পাস করতে পারেন, যা ACTION_SEARCH ইনটেন্টে অন্তর্ভুক্ত।

আপনার সার্চ করা যায় এমন অ্যাক্টিভিটিতে এই ধরনের ডেটা পাস করতে, যে অ্যাক্টিভিটি থেকে ব্যবহারকারী সার্চ করতে পারবেন, সেটির জন্য onSearchRequested() পদ্ধতি ওভাররাইড করুন, অতিরিক্ত ডেটা সহ Bundle তৈরি করুন এবং সার্চ ডায়ালগ অ্যাক্টিভেট করতে startSearch() কল করুন। যেমন:

Kotlin

override fun onSearchRequested(): Boolean {
    val appData = Bundle().apply {
        putBoolean(JARGON, true)
    }
    startSearch(null, false, appData, false)
    return true
}

জাভা

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

'সত্য' রিটার্ন করার অর্থ হল আপনি এই কলব্যাক ইভেন্টটি সফলভাবে ম্যানেজ করেছেন এবং সার্চ ডায়ালগ অ্যাক্টিভেট করতে startSearch() কল করেছেন। ব্যবহারকারী কোনও কোয়েরি জমা দেওয়ার পরে, আপনার যোগ করা ডেটার সাথে সেটি আপনার সার্চযোগ্য অ্যাক্টিভিটিতে ডেলিভার করা হয়। সার্চ রিফাইন করতে আপনি APP_DATA Bundle থেকে অতিরিক্ত ডেটা এক্সট্র্যাক্ট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false

জাভা

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}

সার্চ উইজেট ব্যবহার করুন

অ্যাপের উপরের বারে সার্চ ভিউ দেখানো ছবি

ছবি ১. অ্যাপ বারে অ্যাকশন ভিউ হিসেবে SearchViewউইজেট।

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

সার্চ উইজেট কনফিগার করুন

আপনি একটি সার্চ কনফিগারেশন এবং একটি সার্চযোগ্য অ্যাক্টিভিটি তৈরি করার পরে, setSearchableInfo() কল করে এবং SearchableInfo অবজেক্ট পাস করে প্রতিটি SearchView-এর জন্য অ্যাসিস্টেড সার্চ চালু করুন যা আপনার সার্চযোগ্য কনফিগারেশনকে প্রতিনিধিত্ব করে।

আপনি SearchManager-এ getSearchableInfo() নম্বরে কল করে SearchableInfo-এর রেফারেন্স পেতে পারেন।

যেমন, আপনি অ্যাপ বারে অ্যাকশন ভিউ হিসেবে SearchView ব্যবহার করলে, onCreateOptionsMenu() কলব্যাক চলাকালীন উইজেট চালু করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the options menu from XML.
    val inflater = menuInflater
    inflater.inflate(R.menu.options_menu, menu)

    // Get the SearchView and set the searchable configuration.
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.menu_search).actionView as SearchView).apply {
        // Assumes current activity is the searchable activity.
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default.
    }

    return true
}

জাভা

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration.
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default.

    return true;
}

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

অ্যাপ বারে অ্যাকশন ভিউ সম্পর্কে আরও তথ্যের জন্য, অ্যাকশন ভিউ এবং অ্যাকশন প্রদানকারী ব্যবহার করুন দেখুন।

সার্চ উইজেটের অন্যান্য ফিচার

SearchView উইজেট কিছু অতিরিক্ত ফিচার প্রদান করে যা আপনি ব্যবহার করতে চাইতে পারেন:

জমা দেওয়ার বোতাম
ডিফল্ট হিসেবে, সার্চ কোয়েরি জমা দেওয়ার কোনও বোতাম নেই, তাই ব্যবহারকারীকে সার্চ শুরু করতে কীবোর্ডের Return কী প্রেস করতে হবে। আপনি setSubmitButtonEnabled(true) কল করে "জমা দিন" বোতাম যোগ করতে পারবেন।
সার্চ সাজেশনের জন্য কোয়েরি রিফাইনমেন্ট
আপনি সার্চ সাজেশন চালু করলে, সাধারণত আশা করেন যে ব্যবহারকারী কোনও সাজেশন বেছে নেবেন, তবে তারা সাজেস্ট করা সার্চ কোয়েরি রিফাইন করতেও চাইতে পারেন। আপনি প্রতিটি সাজেশনের পাশে একটি বোতাম যোগ করতে পারেন যা setQueryRefinementEnabled(true) কল করে ব্যবহারকারীর দ্বারা রিফাইন করার জন্য সার্চ বক্সে সাজেশন যোগ করে।
সার্চ বক্সের দৃশ্যমানতা টগল করার ক্ষমতা
ডিফল্ট হিসেবে, সার্চ উইজেট "আইকনিফায়েড" করা থাকে, যার অর্থ হল এটি শুধুমাত্র একটি সার্চ আইকন—একটি আতস কাচ দ্বারা দেখানো হয়। ব্যবহারকারী আইকনে ট্যাপ করলে, এটি বড় হয়ে সার্চ বক্স দেখায়। আগের উদাহরণে যেমন দেখানো হয়েছে, আপনি setIconifiedByDefault(false) কল করে ডিফল্ট হিসেবে সার্চ বক্স দেখাতে পারবেন। এছাড়াও, আপনি setIconified() কল করে সার্চ উইজেটের উপস্থিতি টগল করতে পারেন।

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

উইজেট ও ডায়ালগ, দুটিই ব্যবহার করুন

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

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

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

ভয়েস সার্চ যোগ করুন

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

এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>

ভয়েস সার্চ চালু করতে showVoiceSearchButton ভ্যালু প্রয়োজন। দ্বিতীয় ভ্যালু, launchRecognizer, নির্দিষ্ট করে যে ভয়েস সার্চ বোতামকে অবশ্যই একটি শনাক্তকারী চালু করতে হবে যা সার্চযোগ্য অ্যাক্টিভিটিতে ট্রান্সক্রাইব করা টেক্সট ফিরিয়ে দেয়।

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

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

সার্চ ডায়ালগ ও সার্চ উইজেট, দুটিই Android সিস্টেমের সহায়তায় ব্যবহারকারীর টাইপ করার সময় সার্চ সাজেশন প্রদান করতে পারে। সিস্টেমটি সাজেশনের তালিকা ম্যানেজ করে এবং ব্যবহারকারী কোনও সাজেশন বেছে নিলে ইভেন্টটি হ্যান্ডেল করে।

আপনি দুই ধরনের সার্চ সাজেশন দিতে পারেন:

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