সার্চ ইন্টারফেস সেট-আপ করুন

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

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

অ্যাপ বারে SearchView যোগ করুন

অ্যাপ বারে SearchView উইজেট যোগ করতে, আপনার প্রোজেক্টে res/menu/options_menu.xml নামে একটি ফাইল তৈরি করুন এবং ফাইলে নিম্নলিখিত কোড যোগ করুন। এই কোড সার্চ আইটেম কীভাবে তৈরি করতে হয় তা নির্ধারণ করে, যেমন আইকন ব্যবহার করা এবং আইটেমের নাম। collapseActionView অ্যাট্রিবিউট আপনার SearchView-কে পুরো অ্যাপ বার জুড়ে প্রসারিত হতে দেয় এবং ব্যবহার না হলে আবার স্বাভাবিক অ্যাপ বার আইটেমে সঙ্কুচিত করে দেয়। হ্যান্ডসেট ডিভাইসে অ্যাপ বারের জায়গা সীমিত হওয়ার কারণে, ব্যবহারকারীকে আরও ভালো অভিজ্ঞতা প্রদান করতে আমরা collapsibleActionView অ্যাট্রিবিউট ব্যবহার করার সাজেশন দিই।

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

আপনি আরও অ্যাক্সেসযোগ্য সার্চ আইকন চাইলে, /res/drawable ফোল্ডারে একটি ic_search.xml ফাইল তৈরি করুন এবং এতে নিম্নলিখিত কোড অন্তর্ভুক্ত করুন:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

অ্যাপ বারে SearchView দেখাতে, আপনার অ্যাক্টিভিটির onCreateOptionsMenu() পদ্ধতিতে XML মেনু রিসোর্স res/menu/options_menu.xml ইনফ্লেট করুন:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

অ্যাপটি চালালে এই ধরনের কিছু তৈরি হয়:

একটি ছবি, যাতে অ্যাপের উপরের বারে সার্চ আইকন সহ একটি খালি স্ক্রিন দেখা যাচ্ছে
ছবি ১. অ্যাপের উপরের বারে একটি সার্চ আইকন।

আপনার অ্যাপের অ্যাপ বারে SearchView দেখা যাচ্ছে, কিন্তু এটি কাজ করছে না। আপনি সার্চ আইকনে ট্যাপ করলে, এই ধরনের কিছু দেখতে পাবেন:

সার্চ ভিউ অ্যাকশনে আছে তা দেখানো ছবি
ছবি ২. অ্যাকশন মোডে SearchView।

SearchView-কে কার্যকরী করতে, আপনাকে অবশ্যই নির্ধারণ করতে হবে যে SearchView কীভাবে কাজ করবে।

সার্চ কনফিগারেশন তৈরি করা

SearchView কীভাবে কাজ করে তা সার্চ কনফিগারেশন নির্দিষ্ট করে এবং res/xml/searchable.xml ফাইলে তা উল্লেখ করা থাকে। সার্চ কনফিগারেশনে কমপক্ষে একটি android:label অ্যাট্রিবিউট থাকতে হবে যার মান আপনার Android ম্যানিফেস্টে <application> বা <activity> এলিমেন্টের android:label অ্যাট্রিবিউটের মানের সমান। তবে, সার্চ বক্সে কী লিখতে হবে সেই সম্পর্কে ব্যবহারকারীকে ধারণা দিতে, আমরা android:hint অ্যাট্রিবিউট যোগ করারও সাজেস্ট করি।

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

আপনার অ্যাপের ম্যানিফেস্ট ফাইলে, একটি <meta-data> এলিমেন্ট ঘোষণা করুন যা res/xml/searchable.xml ফাইলকে নির্দেশ করে। <activity>-এ এলিমেন্ট ঘোষণা করুন যেখানে আপনি SearchView দেখাতে চান।

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

আপনার তৈরি করা onCreateOptionsMenu() পদ্ধতিতে, setSearchableInfo(SearchableInfo) কল করে SearchView-এর সাথে সার্চ কনফিগারেশন অ্যাসোসিয়েট করুন:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

getSearchableInfo() -এ কল করার মাধ্যমে SearchableInfo অবজেক্ট পাওয়া যায় যা সার্চ কনফিগারেশন XML ফাইল থেকে তৈরি করা হয়। সার্চ কনফিগারেশন আপনার SearchView-এর সাথে সঠিকভাবে যুক্ত হলে এবং ব্যবহারকারী কোনও কোয়েরি জমা দিলে, SearchView ACTION_SEARCH ইনটেন্টের সাথে একটি অ্যাক্টিভিটি শুরু করে। তারপর, আপনার এমন একটি অ্যাক্টিভিটি প্রয়োজন যা এই ইনটেন্টের জন্য ফিল্টার করতে এবং সার্চ কোয়েরি ম্যানেজ করতে পারে।

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

সার্চ করা যায় এমন অ্যাক্টিভিটি ACTION_SEARCH ইনটেন্টের জন্য ফিল্টার করে এবং ডেটা সেটে কোয়েরি সার্চ করে। সার্চ করা যায় এমন অ্যাক্টিভিটি তৈরি করতে, ACTION_SEARCH ইনটেন্টের জন্য ফিল্টার করতে আপনার পছন্দের অ্যাক্টিভিটি ঘোষণা করুন:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

আপনার সার্চ করা যায় এমন অ্যাক্টিভিটিতে, ACTION_SEARCH ইনটেন্ট ম্যানেজ করুন আপনার onCreate() পদ্ধতিতে এটি চেক করার মাধ্যমে।

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

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

সার্চ কোয়েরি পাওয়ার পরে, আপনি এটি ViewModel-এ পাস করতে পারবেন, যেখানে আপনি এটি আপনার আর্কিটেকচারের অন্যান্য লেয়ারে ব্যবহার করে সার্চ ফলাফল ফিরিয়ে এনে দেখাতে পারবেন।