অ্যাকশন ভিউ এবং অ্যাকশন প্রোভাইডার ব্যবহার করুন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
জেটপ্যাক কম্পোজ হলো অ্যান্ড্রয়েডের জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে কীভাবে কম্পোনেন্ট যোগ করতে হয় তা জানুন।

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

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

AndroidX বেশ কিছু বিশেষায়িত অ্যাকশন ভিউ এবং অ্যাকশন প্রোভাইডার উইজেট প্রদান করে। উদাহরণস্বরূপ, SearchView উইজেটটি সার্চ কোয়েরি প্রবেশ করানোর জন্য একটি অ্যাকশন ভিউ বাস্তবায়ন করে। ShareActionProvider উইজেটটি অন্যান্য অ্যাপের সাথে তথ্য শেয়ার করার জন্য একটি অ্যাকশন প্রোভাইডার বাস্তবায়ন করে। এছাড়াও আপনি আপনার নিজস্ব অ্যাকশন ভিউ এবং অ্যাকশন প্রোভাইডার সংজ্ঞায়িত করতে পারেন।

একটি অ্যাকশন ভিউ যোগ করুন

একটি অ্যাকশন ভিউ যোগ করতে, "অ্যাকশন যোগ ও পরিচালনা" অংশে বর্ণিত পদ্ধতি অনুযায়ী টুলবারের মেনু রিসোর্সে একটি <item> এলিমেন্ট তৈরি করুন। <item> এলিমেন্টটিতে নিম্নলিখিত অ্যাট্রিবিউটগুলোর মধ্যে যেকোনো একটি যোগ করুন:

  • actionViewClass : একটি উইজেটের ক্লাস যা অ্যাকশনটি বাস্তবায়ন করে।
  • actionLayout : একটি লেআউট রিসোর্স যা অ্যাকশনের উপাদানগুলো বর্ণনা করে

showAsAction অ্যাট্রিবিউটটি "ifRoom|collapseActionView" অথবা "never|collapseActionView" -এ সেট করুন। collapseActionView ফ্ল্যাগটি নির্দেশ করে যে, ব্যবহারকারী যখন উইজেটটির সাথে ইন্টারঅ্যাক্ট করছেন না, তখন সেটি কীভাবে প্রদর্শিত হবে। যদি উইজেটটি অ্যাপ বারে থাকে, তাহলে অ্যাপটি উইজেটটিকে একটি আইকন হিসেবে প্রদর্শন করে। যদি উইজেটটি ওভারফ্লো মেনুতে থাকে, তাহলে অ্যাপটি উইজেটটিকে একটি মেনু আইটেম হিসেবে প্রদর্শন করে। যখন ব্যবহারকারী অ্যাকশন ভিউটির সাথে ইন্টারঅ্যাক্ট করেন, তখন এটি প্রসারিত হয়ে অ্যাপ বারটি পূরণ করে।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি অ্যাপ বারে একটি SearchView উইজেট যোগ করে:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

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

ছবিতে একটি সার্চ বার দেখানো হচ্ছে, যার শুরুতে ও শেষে আইকন রয়েছে।
চিত্র ১. শুরুতে ও শেষে আইকনসহ সার্চ বার।

যখন ব্যবহারকারী আইকন বা মেনু আইটেমটিতে ট্যাপ করেন, তখন উইজেটটি প্রসারিত হয়ে টুলবারটি পূর্ণ করে, ফলে ব্যবহারকারী এটির সাথে ইন্টারঅ্যাক্ট করতে পারেন।

একটি ছবি যেখানে দেখানো হচ্ছে সার্চ বারে ফোকাস করা হলে একটি সার্চ ভিউ খুলে যায়।
চিত্র ২. সার্চ বারে ফোকাস করা হলে সার্চ ভিউ খুলে যায়।

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

কোটলিন

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

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

জাভা

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

অ্যাকশন ভিউ সম্প্রসারণে প্রতিক্রিয়া জানান

যদি অ্যাকশনের <item> এলিমেন্টে collapseActionView ফ্ল্যাগ থাকে, তাহলে ব্যবহারকারী অ্যাকশন ভিউটির সাথে ইন্টারঅ্যাক্ট না করা পর্যন্ত অ্যাপটি অ্যাকশন ভিউটিকে একটি আইকন হিসেবে প্রদর্শন করে। যখন ব্যবহারকারী আইকনটিতে ট্যাপ করেন, তখন onOptionsItemSelected() এর বিল্ট-ইন হ্যান্ডলার অ্যাকশন ভিউটিকে এক্সপ্যান্ড করে। যদি আপনার অ্যাক্টিভিটি সাবক্লাস onOptionsItemSelected() মেথডটি ওভাররাইড করে, তাহলে আপনার ওভাররাইড মেথডটিকে অবশ্যই super.onOptionsItemSelected() কল করতে হবে, যাতে সুপারক্লাসটি অ্যাকশন ভিউটিকে এক্সপ্যান্ড করতে পারে।

অ্যাকশনটি এক্সপ্যান্ড বা কলাপস করা হলে যদি আপনি কিছু করতে চান, তাহলে আপনি MenuItem.OnActionExpandListener ইমপ্লিমেন্ট করে এমন একটি ক্লাস ডিফাইন করতে পারেন এবং setOnActionExpandListener() ফাংশনে সেই ক্লাসের একটি মেম্বার পাস করতে পারেন। উদাহরণস্বরূপ, কোনো অ্যাকশন ভিউ এক্সপ্যান্ড বা কলাপস করা হয়েছে কিনা তার উপর ভিত্তি করে আপনি অ্যাক্টিভিটি আপডেট করতে চাইতে পারেন। নিচের কোড স্নিপেটটিতে দেখানো হয়েছে কীভাবে একটি লিসেনার ডিফাইন এবং পাস করতে হয়:

কোটলিন

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

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

জাভা

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

একটি অ্যাকশন প্রোভাইডার যোগ করুন

একটি অ্যাকশন প্রোভাইডার ডিক্লেয়ার করতে, "অ্যাড অ্যান্ড হ্যান্ডেল অ্যাকশনস" অংশে বর্ণিত পদ্ধতি অনুযায়ী টুলবারের মেনু রিসোর্সে একটি <item> এলিমেন্ট তৈরি করুন। একটি actionProviderClass অ্যাট্রিবিউট যোগ করুন এবং এটিকে অ্যাকশন প্রোভাইডার ক্লাসের সম্পূর্ণ কোয়ালিফাইড ক্লাস নামে সেট করুন।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি ShareActionProvider ঘোষণা করে, যা AndroidX লাইব্রেরিতে সংজ্ঞায়িত একটি উইজেট এবং এটি আপনার অ্যাপকে অন্যান্য অ্যাপের সাথে ডেটা শেয়ার করতে দেয়:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

এক্ষেত্রে উইজেটটির জন্য আইকন ঘোষণা করার প্রয়োজন নেই, কারণ ShareActionProvider তার নিজস্ব গ্রাফিক্স সরবরাহ করে। যদি আপনি কোনো কাস্টম অ্যাকশন ব্যবহার করেন, তবে একটি আইকন ঘোষণা করুন।

অতিরিক্ত সম্পদ

  • আপনার টপ অ্যাপ বারে একটি শেয়ার অ্যাকশন যোগ করার উদাহরণের জন্য ShareActionProvider দেখুন।
  • কাস্টম অ্যাকশন প্রোভাইডার তৈরি করার বিষয়ে আরও তথ্যের জন্য ActionProvider দেখুন।