মেনু যোগ করুন

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

বিভিন্ন ধরনের অ্যাপে মেনু হল একটি সাধারণ ইউজার ইন্টারফেস কম্পোনেন্ট। পরিচিত ও সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে, আপনার অ্যাক্টিভিটিতে ব্যবহারকারীর অ্যাকশন ও অন্যান্য বিকল্প দেখাতে Menu API ব্যবহার করুন।

ওভারফ্লো মেনুর উদাহরণ দেখানো ছবি
ছবি ১. আইকন ট্যাপ করার মাধ্যমে ট্রিগার করা একটি মেনু, যা ওভারফ্লো মেনু আইকনের নিচে দেখা যায়।

এই ডকুমেন্ট থেকে জানা যাবে যে Android-এর সব ভার্সনে কীভাবে তিন ধরনের মৌলিক মেনু বা অ্যাকশন প্রেজেন্টেশন তৈরি করতে হয়:

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

বিকল্পের মেনু তৈরি করুন বিভাগ দেখুন।

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

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

প্রাসঙ্গিক মেনু তৈরি করুন বিভাগ দেখুন।

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

পপ-আপ মেনু তৈরি করুন বিভাগ দেখুন।

XML-এ একটি মেনু নির্ধারণ করুন

সব ধরনের মেনুর জন্য, Android মেনু আইটেম সংজ্ঞায়িত করতে স্ট্যান্ডার্ড XML ফর্ম্যাট প্রদান করে। আপনার অ্যাক্টিভিটির কোডে মেনু তৈরি করার পরিবর্তে, XML মেনু রিসোর্সে মেনু এবং এর সব আইটেম সংজ্ঞায়িত করুন। আপনি তারপর মেনু রিসোর্স ইনফ্লেট করতে পারবেন—আপনার অ্যাক্টিভিটি বা ফ্র্যাগমেন্টে এটি Menu অবজেক্ট হিসেবে লোড করে।

নিম্নলিখিত কারণে মেনু রিসোর্স ব্যবহার করা একটি ভালো অভ্যাস:

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

মেনু নির্ধারণ করতে, আপনার প্রোজেক্টের res/menu/ ডিরেক্টরির মধ্যে একটি XML ফাইল তৈরি করুন এবং নিম্নলিখিত এলিমেন্ট সহ মেনু তৈরি করুন:

<menu>
একটি Menu সংজ্ঞায়িত করে, যা মেনু আইটেমের জন্য একটি কন্টেনার। ফাইলের রুট নোড হিসেবে <menu> এলিমেন্ট থাকতে হবে এবং এতে এক বা একাধিক <item> ও <group> এলিমেন্ট থাকতে পারে।
<item>
একটি MenuItem তৈরি করে, যা মেনুতে একটি আইটেমকে দেখায়। সাবমেনু তৈরি করতে এই এলিমেন্টে নেস্ট করা <menu> এলিমেন্ট থাকতে পারে।
<group>
<item> এলিমেন্টের জন্য একটি ঐচ্ছিক, অদৃশ্য কন্টেনার। এটি আপনাকে মেনু আইটেমগুলিকে শ্রেণীবদ্ধ করতে দেয় যাতে তারা বৈশিষ্ট্যগুলি ভাগ করে, যেমন সক্রিয় অবস্থা এবং দৃশ্যমানতা। আরও তথ্যের জন্য, মেনু গ্রুপ তৈরি করুন বিভাগ দেখুন।

এখানে game_menu.xml নামের একটি উদাহরণ মেনু দেওয়া হল:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:icon="@drawable/ic_new_game"
          android:title="@string/new_game"
          app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

<item> এলিমেন্ট একাধিক অ্যাট্রিবিউট সাপোর্ট করে যা আপনি কোনও আইটেমের উপস্থিতি ও আচরণ নির্ধারণ করতে ব্যবহার করতে পারবেন। আগের মেনুতে থাকা আইটেমে নিম্নলিখিত অ্যাট্রিবিউট থাকে:

android:id
আইটেমের জন্য অনন্য রিসোর্স আইডি, যা ব্যবহারকারী আইটেমটি বেছে নিলে অ্যাপকে সেটি শনাক্ত করতে সাহায্য করে।
android:icon
আইটেমের আইকন হিসেবে ব্যবহার করার জন্য ড্রয়েবেলের রেফারেন্স।
android:title
আইটেমের শীর্ষক হিসেবে ব্যবহার করার জন্য স্ট্রিংয়ের রেফারেন্স।
android:showAsAction
অ্যাপ বারে এই আইটেম কখন এবং কীভাবে অ্যাকশন আইটেম হিসেবে দেখা যাবে তার স্পেসিফিকেশন।

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

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

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
          android:title="@string/file" >
        <!-- "file" submenu -->
        <menu>
            <item android:id="@+id/create_new"
                  android:title="@string/create_new" />
            <item android:id="@+id/open"
                  android:title="@string/open" />
        </menu>
    </item>
</menu>

আপনার অ্যাক্টিভিটিতে মেনু ব্যবহার করতে, মেনু রিসোর্স _ইনফ্লেট_ করুন, MenuInflater.inflate() ব্যবহার করে XML রিসোর্সকে প্রোগ্রামেবল অবজেক্টে কনভার্ট করুন। নিম্নলিখিত বিভাগগুলি দেখায় যে প্রতিটি মেনুর প্রকারের জন্য কীভাবে একটি মেনু ইনফ্লেট করতে হয়।

বিকল্পের মেনু তৈরি করা

বিকল্পের মেনু, যেমন চিত্র ১-এ দেখানো হয়েছে, সেখানে আপনি বর্তমান অ্যাক্টিভিটির প্রসঙ্গে প্রাসঙ্গিক অ্যাকশন ও অন্যান্য বিকল্প অন্তর্ভুক্ত করেন, যেমন "সার্চ করুন," "ইমেল কম্পোজ করুন" এবং "সেটিংস।"

Google Sheets অ্যাপের জন্য অ্যাপ বার দেখানো একটি ছবি
ছবি ২. Google Sheets অ্যাপ, অ্যাকশন ওভারফ্লো বোতাম সহ একাধিক বোতাম দেখাচ্ছে।

আপনি নিজের Activity সাবক্লাস বা Fragment সাবক্লাস থেকে বিকল্পের মেনুর জন্য আইটেম ঘোষণা করতে পারবেন। আপনার অ্যাক্টিভিটি এবং ফ্র্যাগমেন্ট, উভয়ই যদি বিকল্পের মেনুর জন্য আইটেম ঘোষণা করে, তাহলে আইটেমগুলি UI-তে একত্রিত করা হয়। অ্যাক্টিভিটির আইটেমগুলি প্রথমে দেখা যায়, তারপরে প্রতিটি ফ্র্যাগমেন্টের আইটেমগুলি দেখা যায়, যে ক্রমে ফ্র্যাগমেন্টগুলি অ্যাক্টিভিটিতে যোগ করা হয়েছে। প্রয়োজন হলে, আপনি প্রতিটি <item>-এ android:orderInCategory অ্যাট্রিবিউট সহ মেনু আইটেমগুলি পুনরায় সাজাতে পারেন।

কোনও অ্যাক্টিভিটির জন্য বিকল্পের মেনু নির্দিষ্ট করতে, onCreateOptionsMenu() ওভাররাইড করুন। ফ্র্যাগমেন্ট তার নিজস্ব onCreateOptionsMenu() কলব্যাক প্রদান করে। এই পদ্ধতিতে, আপনি নিজের মেনু রিসোর্স ইনফ্লেট করতে পারবেন, XML-এ যা সংজ্ঞায়িত করা আছে, কলব্যাকে দেওয়া Menu-এ। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.game_menu, menu)
    return true
}

জাভা

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

এছাড়াও, আপনি add() ব্যবহার করে মেনু আইটেম যোগ করতে পারেন এবং findItem() ব্যবহার করে আইটেম ফিরিয়ে আনতে পারেন যাতে MenuItem API-এর মাধ্যমে সেগুলির প্রপার্টি সংশোধন করা যায়।

ক্লিক ইভেন্ট ম্যানেজ করা

ব্যবহারকারী বিকল্পের মেনু থেকে কোনও আইটেম বেছে নিলে, যার মধ্যে অ্যাপ বারে অ্যাকশন আইটেমও অন্তর্ভুক্ত, সিস্টেম আপনার অ্যাক্টিভিটির onOptionsItemSelected() মেথড কল করে। এই পদ্ধতি বেছে নেওয়া MenuItem পাস করে। আপনি getItemId() কল করে আইটেমটি শনাক্ত করতে পারবেন, যা মেনু আইটেমের জন্য অনন্য আইডি রিটার্ন করে, যা মেনু রিসোর্সে android:id অ্যাট্রিবিউট দ্বারা বা add() পদ্ধতিতে দেওয়া একটি পূর্ণসংখ্যা দ্বারা সংজ্ঞায়িত করা হয়। আপনি এই আইডিকে পরিচিত মেনু আইটেমের সাথে মিলিয়ে দেখতে পারেন যাতে উপযুক্ত অ্যাকশন নেওয়া যায়।

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection.
    return when (item.itemId) {
        R.id.new_game -> {
            newGame()
            true
        }
        R.id.help -> {
            showHelp()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

জাভা

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection.
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

আপনি কোনও মেনু আইটেম সফলভাবে ম্যানেজ করলে, true রিটার্ন করুন। আপনি মেনু আইটেম ম্যানেজ না করলে, onOptionsItemSelected()-এর সুপারক্লাস ইমপ্লিমেন্টেশন কল করুন। ডিফল্ট ইমপ্লিমেন্টেশন false রিটার্ন করে।

আপনার অ্যাক্টিভিটিতে ফ্র্যাগমেন্ট থাকলে, সিস্টেম প্রথমে অ্যাক্টিভিটির জন্য onOptionsItemSelected() কল করে, তারপর প্রতিটি ফ্র্যাগমেন্টের জন্য যে ক্রমে ফ্র্যাগমেন্ট যোগ করা হয়েছে সেই ক্রমে কল করে, যতক্ষণ না একটি true রিটার্ন করে বা সব ফ্র্যাগমেন্ট কল করা হয়।

রানটাইমে মেনু আইটেম পরিবর্তন করা

সিস্টেম onCreateOptionsMenu() কল করার পরে, এটি আপনার পূরণ করা Menu-এর একটি ইনস্ট্যান্স ধরে রাখে এবং মেনু বাতিল না হওয়া পর্যন্ত আবার onCreateOptionsMenu() কল করে না। তবে, শুধুমাত্র প্রাথমিক মেনু স্টেট তৈরি করতে onCreateOptionsMenu() ব্যবহার করুন এবং অ্যাক্টিভিটি লাইফসাইকেল চলাকালীন পরিবর্তন করার জন্য নয়।

অ্যাক্টিভিটি লাইফসাইকেল চলাকালীন ঘটা ইভেন্টের উপর ভিত্তি করে আপনি বিকল্পের মেনু পরিবর্তন করতে চাইলে, onPrepareOptionsMenu() পদ্ধতিতে তা করতে পারবেন। এই পদ্ধতি আপনাকে Menu অবজেক্ট পাস করে, কারণ এটি বর্তমানে উপস্থিত আছে, তাই আপনি এটি পরিবর্তন করতে পারবেন, যেমন আইটেম যোগ করা, সরানো বা বন্ধ করা। এছাড়াও, ফ্র্যাগমেন্ট একটি onPrepareOptionsMenu() কলব্যাক প্রদান করে।

অ্যাপ বারে মেনু আইটেম দেখানো হলে, বিকল্পের মেনু সবসময় খোলা আছে বলে ধরে নেওয়া হয়। কোনও ইভেন্ট ঘটলে এবং আপনি মেনু আপডেট করতে চাইলে, invalidateOptionsMenu()-এ কল করে সিস্টেমকে onPrepareOptionsMenu()-এ কল করার অনুরোধ করুন।

একটি প্রাসঙ্গিক মেনু তৈরি করুন

একটি ছবি, যাতে একটি ফ্লোটিং কন্টেক্সট মেনু দেখা যাচ্ছে
ছবি ৩. একটি ফ্লোটিং কন্টেক্সট মেনু।

প্রাসঙ্গিক মেনু এমন অ্যাকশন অফার করে যা UI-তে নির্দিষ্ট আইটেম বা প্রাসঙ্গিক ফ্রেমকে প্রভাবিত করে। আপনি যেকোনও ভিউয়ের জন্য সংশ্লিষ্ট মেনু প্রদান করতে পারেন, তবে সেগুলি বেশিরভাগই RecylerView বা অন্যান্য ভিউ সংগ্রহের আইটেমের জন্য ব্যবহার করা হয় যেখানে ব্যবহারকারী প্রতিটি আইটেমে সরাসরি অ্যাকশন নিতে পারেন।

কনটেক্সচুয়াল অ্যাকশন প্রদান করার দুটি উপায় আছে:

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

মনে রাখবেন: সংশ্লিষ্ট মেনু-তে আইটেম শর্টকাট ও আইটেম আইকন কাজ করে না।

একটি ফ্লোটিং কন্টেক্সট মেনু তৈরি করুন

ফ্লোটিং কনটেক্সট মেনু প্রদান করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. registerForContextMenu() কল করে এবং View পাস করে যে View-এর সাথে সংশ্লিষ্ট মেনু যুক্ত আছে সেটি রেজিস্টার করুন।

    আপনার অ্যাক্টিভিটি যদি RecyclerView ব্যবহার করে এবং আপনি যদি চান যে প্রতিটি আইটেম একই সংশ্লিষ্ট মেনু প্রদান করুক, তাহলে RecyclerView-কে registerForContextMenu()-এ পাস করে সংশ্লিষ্ট মেনুর জন্য সব আইটেম রেজিস্টার করুন।

  2. আপনার Activity বা Fragment-এ onCreateContextMenu() পদ্ধতি প্রয়োগ করুন।

    রেজিস্টার করা ভিউতে টাচ করে ধরে রাখার ইভেন্ট হলে, সিস্টেম আপনার onCreateContextMenu() মেথডকে কল করে। এখানে আপনি মেনু আইটেম সংজ্ঞায়িত করেন, সাধারণত একটি মেনু রিসোর্স ইনফ্লেট করে, যেমন নিম্নলিখিত উদাহরণে:

    Kotlin

        override fun onCreateContextMenu(menu: ContextMenu, v: View,
                                menuInfo: ContextMenu.ContextMenuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo)
            val inflater: MenuInflater = menuInflater
            inflater.inflate(R.menu.context_menu, menu)
        }
        

    জাভা

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
        }
        

    MenuInflater আপনাকে মেনু রিসোর্স থেকে সংশ্লিষ্ট মেনু ইনফ্লেট করতে দেয়। কলব্যাক পদ্ধতির প্যারামিটারে ব্যবহারকারীর বেছে নেওয়া View এবং ContextMenu.ContextMenuInfo অবজেক্ট অন্তর্ভুক্ত থাকে যা বেছে নেওয়া আইটেম সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। আপনার অ্যাক্টিভিটিতে যদি একাধিক ভিউ থাকে এবং প্রতিটি ভিউ আলাদা আলাদা কনটেক্সট মেনু প্রদান করে, তাহলে কোন কনটেক্সট মেনু ইনফ্লেট করতে হবে তা নির্ধারণ করতে আপনি এই প্যারামিটারগুলি ব্যবহার করতে পারেন।

  3. নিচের উদাহরণে যেভাবে দেখানো হয়েছে সেইভাবে onContextItemSelected() প্রয়োগ করুন। ব্যবহারকারী কোনও মেনু আইটেম বেছে নিলে, সিস্টেম এই পদ্ধতিকে কল করে যাতে আপনি উপযুক্ত অ্যাকশন নিতে পারেন।

    Kotlin

        override fun onContextItemSelected(item: MenuItem): Boolean {
            val info = item.menuInfo as AdapterView.AdapterContextMenuInfo
            return when (item.itemId) {
                R.id.edit -> {
                    editNote(info.id)
                    true
                }
                R.id.delete -> {
                    deleteNote(info.id)
                    true
                }
                else -> super.onContextItemSelected(item)
            }
        }
        

    জাভা

        @Override
        public boolean onContextItemSelected(MenuItem item) {
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            switch (item.getItemId()) {
                case R.id.edit:
                    editNote(info.id);
                    return true;
                case R.id.delete:
                    deleteNote(info.id);
                    return true;
                default:
                    return super.onContextItemSelected(item);
            }
        }
        

    getItemId() মেথডটি বেছে নেওয়া মেনু আইটেমের আইডি কোয়েরি করে, যা আপনি XML-এ প্রতিটি মেনু আইটেমে android:id অ্যাট্রিবিউট ব্যবহার করে অ্যাসাইন করেন, যেমনটি XML-এ মেনু নির্ধারণ করুন-এ দেখানো হয়েছে।

    আপনি কোনও মেনু আইটেম সফলভাবে ম্যানেজ করলে, true রিটার্ন করুন। আপনি মেনু আইটেম ম্যানেজ না করলে, সুপারক্লাস ইমপ্লিমেন্টেশনে মেনু আইটেম পাস করুন। আপনার অ্যাক্টিভিটিতে ফ্র্যাগমেন্ট থাকলে, অ্যাক্টিভিটি প্রথমে এই কলব্যাক পায়। হ্যান্ডেল না করা হলে সুপারক্লাস কল করার মাধ্যমে, সিস্টেম প্রতিটি ফ্র্যাগমেন্টে সংশ্লিষ্ট কলব্যাক পদ্ধতিতে ইভেন্ট পাস করে, একবারে একটি, প্রতিটি ফ্র্যাগমেন্ট যোগ করার ক্রমে, যতক্ষণ না true বা false ফেরত দেওয়া হয়। Activity এবং android.app.Fragment-এর জন্য ডিফল্ট ইমপ্লিমেন্টেশন false রিটার্ন করে, তাই হ্যান্ডেল করা না হলে সবসময় সুপারক্লাস কল করুন।

কনটেক্সচুয়াল অ্যাকশন মোড ব্যবহার করা

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

যেসব ভিউ কনটেক্সচুয়াল অ্যাকশন প্রদান করে, সেগুলির ক্ষেত্রে আপনি সাধারণত কনটেক্সচুয়াল অ্যাকশন মোড ইনভোক করেন যখন এই দুটি ইভেন্টের মধ্যে একটি বা দুটিই ঘটে:

  • ব্যবহারকারী ভিউতে টাচ করে ধরে থাকেন।
  • ব্যবহারকারী ভিউয়ের মধ্যে চেকবক্স বা একই ধরনের UI কম্পোনেন্ট বেছে নেন।

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

  • ব্যক্তিগত, ইচ্ছামত ভিউতে প্রাসঙ্গিক অ্যাকশনের জন্য।
  • RecyclerView-এ আইটেমের গ্রুপের উপর ব্যাচ কনটেক্সচুয়াল অ্যাকশনের জন্য, ব্যবহারকারীকে একাধিক আইটেম বেছে নিতে এবং সেগুলির সবকটির উপর অ্যাকশন নিতে দেওয়া।

প্রথম পরিস্থিতির জন্য প্রয়োজনীয় সেট-আপের বিবরণ নিম্নলিখিত বিভাগে দেওয়া হয়েছে।

ব্যক্তিগত ভিউয়ের জন্য কনটেক্সচুয়াল অ্যাকশন মোড চালু করুন

ব্যবহারকারী নির্দিষ্ট ভিউ বেছে নিলে তবেই আপনি কনটেক্সচুয়াল অ্যাকশন মোড চালু করতে চাইলে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. নিচের উদাহরণে যেভাবে দেখানো হয়েছে সেইভাবে ActionMode.Callback ইন্টারফেস প্রয়োগ করুন। এর কলব্যাক পদ্ধতিতে, আপনি প্রাসঙ্গিক অ্যাকশন বারের জন্য অ্যাকশন নির্দিষ্ট করতে, অ্যাকশন আইটেমে ক্লিক ইভেন্টের উত্তর দিতে এবং অ্যাকশন মোডের জন্য অন্যান্য লাইফসাইকেল ইভেন্ট ম্যানেজ করতে পারবেন।

    Kotlin

        private val actionModeCallback = object : ActionMode.Callback {
            // Called when the action mode is created. startActionMode() is called.
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                // Inflate a menu resource providing context menu items.
                val inflater: MenuInflater = mode.menuInflater
                inflater.inflate(R.menu.context_menu, menu)
                return true
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false // Return false if nothing is done
            }
    
            // Called when the user selects a contextual menu item.
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return when (item.itemId) {
                    R.id.menu_share -> {
                        shareCurrentItem()
                        mode.finish() // Action picked, so close the CAB.
                        true
                    }
                    else -> false
                }
            }
    
            // Called when the user exits the action mode.
            override fun onDestroyActionMode(mode: ActionMode) {
                actionMode = null
            }
        }
        

    জাভা

        private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
    
            // Called when the action mode is created. startActionMode() is called.
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // Inflate a menu resource providing context menu items.
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.context_menu, menu);
                return true;
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false; // Return false if nothing is done.
            }
    
            // Called when the user selects a contextual menu item.
            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
               switch (item.getItemId()) {
                    case R.id.menu_share:
                        shareCurrentItem();
                        mode.finish(); // Action picked, so close the CAB.
                        return true;
                    default:
                        return false;
                }
            }
    
            // Called when the user exits the action mode.
            @Override
            public void onDestroyActionMode(ActionMode mode) {
                actionMode = null;
            }
        };
        

    এই ইভেন্ট কলব্যাকগুলি বিকল্পের মেনু-এর কলব্যাকের মতোই, তবে এগুলির প্রত্যেকটি ইভেন্টের সাথে সম্পর্কিত ActionMode অবজেক্টও পাস করে। আপনি ActionMode API ব্যবহার করে CAB-তে বিভিন্ন পরিবর্তন করতে পারেন, যেমন setTitle() এবং setSubtitle() দিয়ে শীর্ষক ও সাবটাইটেল সংশোধন করা, যা কতগুলি আইটেম বেছে নেওয়া হয়েছে তা নির্দেশ করার জন্য উপযোগী।

    অ্যাকশন মোড নষ্ট হয়ে গেলে, আগের স্যাম্পেল actionMode ভেরিয়েবলকে null-এ সেট করে। পরবর্তী ধাপে, দেখুন এটি কীভাবে শুরু করা হয় এবং আপনার অ্যাক্টিভিটি বা ফ্র্যাগমেন্টে মেম্বার ভেরিয়েবল সেভ করা কীভাবে কার্যকর হতে পারে।

  2. কল করুন startActionMode() যখন আপনি বারটি দেখাতে চান, যেমন ব্যবহারকারী ভিউতে টাচ করে ধরে রাখেন।

    Kotlin

        someView.setOnLongClickListener { view ->
            // Called when the user performs a touch & hold on someView.
            when (actionMode) {
                null -> {
                    // Start the CAB using the ActionMode.Callback defined earlier.
                    actionMode = activity?.startActionMode(actionModeCallback)
                    view.isSelected = true
                    true
                }
                else -> false
            }
        }
        

    জাভা

        someView.setOnLongClickListener(new View.OnLongClickListener() {
            // Called when the user performs a touch & hold on someView.
            public boolean onLongClick(View view) {
                if (actionMode != null) {
                    return false;
                }
    
                // Start the CAB using the ActionMode.Callback defined earlier.
                actionMode = getActivity().startActionMode(actionModeCallback);
                view.setSelected(true);
                return true;
            }
        });
        

    আপনি startActionMode() কল করলে, সিস্টেম তৈরি করা ActionMode ফিরিয়ে দেয়। এটি মেম্বার ভেরিয়েবলে সেভ করে, আপনি অন্যান্য ইভেন্টের উত্তরে প্রাসঙ্গিক অ্যাকশন বারে পরিবর্তন করতে পারবেন। আগের স্যাম্পেলে, ActionMode ব্যবহার করা হয়েছে যাতে অ্যাকশন মোড শুরু করার আগে মেম্বারটি খালি কিনা তা চেক করে, ActionMode ইনস্ট্যান্স আগে থেকেই অ্যাক্টিভ থাকলে, সেটি যাতে আবার তৈরি না হয় তা নিশ্চিত করা যায়।

পপ-আপ মেনু তৈরি করুন

Gmail অ্যাপে পপ-আপ মেনু দেখানো একটি ছবি, যা উপরে ডানদিকে ওভারফ্লো বোতামে অ্যাঙ্কর করা আছে।
ছবি ৪. Gmail অ্যাপে একটি পপ-আপ মেনু, উপরে ডানদিকের কোণে ওভারফ্লো বোতামে অ্যাঙ্কর করা।

PopupMenu হল একটি মডেল মেনু যা View-এর সাথে অ্যাঙ্কর করা থাকে। জায়গা থাকলে এটি অ্যাঙ্কর ভিউয়ের নিচে দেখানো হয়, অন্যথায় ভিউয়ের উপরে দেখানো হয়। এটি নিম্নলিখিত ক্ষেত্রে কাজে লাগে:

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

আপনি যদি XML-এ আপনার মেনু নির্ধারণ করেন, তাহলে আপনি কীভাবে পপ-আপ মেনু দেখাতে পারেন তা এখানে দেওয়া হল:

  1. কনস্ট্রাক্টরের সাহায্যে PopupMenu ইনস্ট্যান্টিয়েট করুন, যা বর্তমান অ্যাপ Context এবং View নেয়, যার সাথে মেনু অ্যাঙ্কর করা থাকে।
  2. MenuInflater ব্যবহার করে আপনার মেনু রিসোর্সকে Menu অবজেক্টে ইনফ্লেট করুন যা PopupMenu.getMenu() রিটার্ন করে।
  3. PopupMenu.show()-এ কল করুন।

যেমন, এখানে একটি বোতাম আছে যা পপ-আপ মেনু দেখায়:

<ImageButton
    android:id="@+id/dropdown_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/descr_overflow_button"
    android:src="@drawable/arrow_drop_down" />

অ্যাক্টিভিটি তখন এইভাবে পপ-আপ মেনু দেখাতে পারে:

Kotlin

findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener {
    val popup = PopupMenu(this, it)
    val inflater: MenuInflater = popup.menuInflater
    inflater.inflate(R.menu.actions, popup.menu)
    popup.show()
}

জাভা

findViewById(R.id.dropdown_menu).setOnClickListener(v -> {
    PopupMenu popup = new PopupMenu(this, v);
    popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu());
    popup.show();
});

ব্যবহারকারী কোনও আইটেম বেছে নিলে বা মেনু এলাকার বাইরে ট্যাপ করলে মেনু বন্ধ হয়ে যায়। আপনি PopupMenu.OnDismissListener ব্যবহার করে বাতিল করার ইভেন্ট শুনতে পারবেন।

ক্লিক ইভেন্ট ম্যানেজ করা

ব্যবহারকারী কোনও মেনু আইটেম বেছে নিলে অ্যাকশন পারফর্ম করতে, PopupMenu.OnMenuItemClickListener ইন্টারফেস প্রয়োগ করুন এবং setOnMenuItemclickListener() কল করে আপনার PopupMenu-এর সাথে এটি রেজিস্টার করুন। ব্যবহারকারী কোনও আইটেম বেছে নিলে, সিস্টেম আপনার ইন্টারফেসে onMenuItemClick() কলব্যাক কল করে।

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

Kotlin

fun showMenu(v: View) {
    PopupMenu(this, v).apply {
        // MainActivity implements OnMenuItemClickListener.
        setOnMenuItemClickListener(this@MainActivity)
        inflate(R.menu.actions)
        show()
    }
}

override fun onMenuItemClick(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.archive -> {
            archive(item)
            true
        }
        R.id.delete -> {
            delete(item)
            true
        }
        else -> false
    }
}

জাভা

public void showMenu(View v) {
    PopupMenu popup = new PopupMenu(this, v);

    // This activity implements OnMenuItemClickListener.
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.archive:
            archive(item);
            return true;
        case R.id.delete:
            delete(item);
            return true;
        default:
            return false;
    }
}

একটি মেনু গ্রুপ তৈরি করুন

মেনু গ্রুপ হল মেনু আইটেমের একটি সংগ্রহ যা নির্দিষ্ট বৈশিষ্ট্য শেয়ার করে। গ্রুপের মাধ্যমে আপনি নিম্নলিখিত কাজগুলি করতে পারবেন:

  • setGroupVisible() ব্যবহার করে সব আইটেম দেখুন বা লুকান।
  • setGroupEnabled() ব্যবহার করে সব আইটেম চালু বা বন্ধ করুন।
  • setGroupCheckable() ব্যবহার করে সব আইটেম চেক করা যাবে কিনা তা নির্দিষ্ট করুন।

আপনার মেনু রিসোর্সে <group> এলিমেন্টের মধ্যে <item> এলিমেন্ট নেস্ট করে অথবা add() পদ্ধতির মাধ্যমে গ্রুপ আইডি নির্দিষ্ট করে আপনি গ্রুপ তৈরি করতে পারবেন।

এখানে একটি মেনু রিসোর্সের উদাহরণ দেওয়া হল যাতে একটি গ্রুপ অন্তর্ভুক্ত আছে:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/menu_save"
          android:title="@string/menu_save" />
    <!-- menu group -->
    <group android:id="@+id/group_delete">
        <item android:id="@+id/menu_archive"
              android:title="@string/menu_archive" />
        <item android:id="@+id/menu_delete"
              android:title="@string/menu_delete" />
    </group>
</menu>

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

চেক করা যায় এমন মেনু আইটেম ব্যবহার করুন

ছবি ৫. টিকচিহ্ন দেওয়া যায় এমন আইটেম সহ সাবমেনু।

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

আপনি <item> এলিমেন্টে android:checkable অ্যাট্রিবিউট ব্যবহার করে আলাদা আলাদা মেনু আইটেমের জন্য অথবা <group> এলিমেন্টে android:checkableBehavior অ্যাট্রিবিউট ব্যবহার করে পুরো গ্রুপের জন্য চেকবলের আচরণ নির্ধারণ করতে পারবেন। যেমন, এই মেনু গ্রুপের সব আইটেম রেডিও বোতামের সাহায্যে চেক করা যাবে:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item android:id="@+id/red"
              android:title="@string/red" />
        <item android:id="@+id/blue"
              android:title="@string/blue" />
    </group>
</menu>

android:checkableBehavior অ্যাট্রিবিউট নিম্নলিখিতগুলির মধ্যে একটি গ্রহণ করে:

single
গ্রুপ থেকে শুধুমাত্র একটি আইটেম চেক করা যাবে, যার ফলে রেডিও বোতাম দেখা যাবে।
all
সব আইটেম চেক করা যাবে, যার ফলে চেকবক্স দেখা যাবে।
none
কোনও আইটেম চেক করা যাবে না।

আপনি <item> এলিমেন্টে android:checked অ্যাট্রিবিউট ব্যবহার করে কোনও আইটেমে ডিফল্ট চেক করা স্ট্যাটাস প্রয়োগ করতে পারেন এবং setChecked() পদ্ধতির মাধ্যমে কোডে এটি পরিবর্তন করতে পারেন।

চেক করা যায় এমন আইটেম বেছে নেওয়া হলে, সিস্টেম আপনার সংশ্লিষ্ট আইটেম-বেছে নেওয়া কলব্যাক পদ্ধতি কল করে, যেমন onOptionsItemSelected()। এখানে আপনি চেকবক্সের স্ট্যাটাস সেট করেন, কারণ চেকবক্স বা রেডিও বোতাম অটোমেটিক নিজের স্ট্যাটাস পরিবর্তন করে না। আপনি আইটেমের বর্তমান অবস্থা সম্পর্কে কোয়েরি করতে পারেন— ব্যবহারকারী এটি বেছে নেওয়ার আগে যেমন ছিল— isChecked()-এর মাধ্যমে এবং তারপর setChecked()-এর মাধ্যমে চেক করা অবস্থা সেট করতে পারেন। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.vibrate, R.id.dont_vibrate -> {
            item.isChecked = !item.isChecked
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

জাভা

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.vibrate:
        case R.id.dont_vibrate:
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

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

অভিপ্রায়ের ভিত্তিতে মেনু আইটেম যোগ করুন

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

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

ইনটেন্ট গ্রহণ করে এমন উপলভ্য অ্যাক্টিভিটির উপর ভিত্তি করে মেনু আইটেম যোগ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. CATEGORY_ALTERNATIVE বা CATEGORY_SELECTED_ALTERNATIVE অথবা দুটি বিভাগই, এবং অন্য কোনও প্রয়োজনীয়তা সহ ইনটেন্ট নির্ধারণ করুন।
  2. Menu.addIntentOptions()-এ কল করুন। Android তখন এমন কোনও অ্যাপ খোঁজে যা ইনটেন্টটি সম্পাদন করতে পারে এবং সেগুলিকে আপনার মেনুতে যোগ করে।

ইন্টেন্ট পূরণ করে এমন কোনও অ্যাপ ইনস্টল করা না থাকলে, কোনও মেনু আইটেম যোগ করা হয় না।

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

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    val intent = Intent(null, dataUri).apply {
        addCategory(Intent.CATEGORY_ALTERNATIVE)
    }

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
            R.id.intent_group,  // Menu group to which new items are added.
            0,                  // Unique item ID (none).
            0,                  // Order for the items (none).
            this.componentName, // The current activity name.
            null,               // Specific items to place first (none).
            intent,             // Intent created above that describes the requirements.
            0,                  // Additional flags to control items (none).
            null)               // Array of MenuItems that correlate to specific items (none).

    return true
}

জাভা

@Override
public boolean onCreateOptionsMenu(Menu menu){
    super.onCreateOptionsMenu(menu);

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    Intent intent = new Intent(null, dataUri);
    intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
         R.id.intent_group,         // Menu group to which new items are added.
         0,                         // Unique item ID (none).
         0,                         // Order for the items (none).
         this.getComponentName(),   // The current activity name.
         null,                      // Specific items to place first (none).
         intent,                    // Intent created above that describes the requirements.
         0,                         // Additional flags to control items (none).
         null);                     // Array of MenuItems that correlate to specific items (none).

    return true;
}

প্রতিটি অ্যাক্টিভিটির জন্য, যা সংজ্ঞায়িত ইনটেন্টের সাথে মেলে এমন একটি ইনটেন্ট ফিল্টার প্রদান করে, একটি মেনু আইটেম যোগ করা হয়, ইনটেন্ট ফিল্টারের android:label-এর মান মেনু আইটেমের শিরোনাম হিসেবে এবং অ্যাপ আইকন মেনু আইটেম আইকন হিসেবে ব্যবহার করে। addIntentOptions() পদ্ধতিটি যোগ করা মেনু আইটেমের সংখ্যা ফেরত দেয়।

আপনার অ্যাক্টিভিটি অন্য মেনুতে যোগ করার অনুমতি দিন

আপনি অন্যান্য অ্যাপে আপনার অ্যাক্টিভিটির পরিষেবা অফার করতে পারেন যাতে আপনার অ্যাপ অন্যদের মেনুতে অন্তর্ভুক্ত করা যায়—আগে বর্ণিত ভূমিকাগুলি উল্টে যায়।

অন্য অ্যাপ মেনুতে অন্তর্ভুক্ত করতে, স্বাভাবিকের মতো ইনটেন্ট ফিল্টার সংজ্ঞায়িত করুন, তবে ইনটেন্ট ফিল্টার বিভাগের জন্য CATEGORY_ALTERNATIVE বা CATEGORY_SELECTED_ALTERNATIVE ভ্যালু বা দুটিই অন্তর্ভুক্ত করুন। এটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...
</intent-filter>

ইনটেন্ট ও ইনটেন্ট ফিল্টার-এ ইনটেন্ট ফিল্টার লেখার ব্যাপারে আরও পড়ুন।