Menambahkan menu

Coba cara Compose
Jetpack Compose adalah toolkit UI yang direkomendasikan untuk Android. Pelajari cara menambahkan komponen di Compose.

Menu adalah komponen antarmuka pengguna yang umum di banyak jenis aplikasi. Untuk memberikan pengalaman pengguna yang sudah dikenal dan konsisten, gunakan Menu API untuk mempresentasikan tindakan pengguna dan opsi lainnya dalam aktivitas Anda.

Gambar yang menunjukkan contoh menu tambahan
Gambar 1. Menu yang dipicu oleh ketukan ikon, muncul di bawah ikon menu tambahan.

Dokumen ini menunjukkan cara membuat tiga jenis dasar presentasi menu atau tindakan pada semua versi Android:

Menu opsi dan panel aplikasi
Menu opsi adalah kumpulan utama item menu untuk suatu aktivitas. Di sinilah Anda menempatkan tindakan yang memiliki dampak global pada aplikasi, seperti "Telusuri", "Tulis email", dan "Setelan".

Lihat bagian Membuat menu opsi.

Menu konteks dan mode tindakan kontekstual
Menu konteks adalah menu mengambang yang muncul saat pengguna menyentuh lama suatu elemen. Menu ini menyediakan tindakan yang memengaruhi konten atau frame konteks yang dipilih.

Mode tindakan kontekstual menampilkan item tindakan yang memengaruhi konten yang dipilih dalam panel di bagian atas layar dan memungkinkan pengguna memilih beberapa item.

Lihat bagian Membuat menu kontekstual.

Menu pop-up
Menu pop-up menampilkan daftar vertikal item yang ditambatkan ke tampilan yang memanggil menu. Cocok untuk menyediakan tambahan tindakan yang terkait dengan konten tertentu atau untuk menyediakan opsi untuk bagian kedua dari suatu perintah. Tindakan di menu pop-up tidak secara langsung memengaruhi konten yang terkait—di sinilah tindakan kontekstual. Sebaliknya, menu pop-up adalah untuk tindakan tambahan yang terkait dengan region konten dalam aktivitas Anda.

Lihat bagian Membuat menu pop-up.

Menentukan menu dalam XML

Untuk semua jenis menu, Android menyediakan format XML standar untuk menentukan item menu. Daripada membuat menu dalam kode aktivitas, tetapkan menu dan semua itemnya dalam resource menu XML. Kemudian, Anda dapat meng-inflate resource menu—memuatnya sebagai objek Menu—dalam aktivitas atau fragmen Anda.

Menggunakan resource menu adalah praktik yang baik karena alasan berikut:

  • Memvisualisasikan struktur menu dalam XML menjadi lebih mudah.
  • Cara ini memisahkan konten untuk menu dari kode perilaku aplikasi Anda.
  • Alat ini memungkinkan Anda membuat konfigurasi menu alternatif untuk berbagai versi platform, ukuran layar, dan konfigurasi lainnya dengan memanfaatkan framework resource aplikasi.

Untuk menentukan menu, buat file XML di dalam direktori res/menu/ project Anda dan buat menu dengan elemen berikut:

<menu>
Mendefinisikan Menu, yang merupakan sebuah container item menu. Elemen <menu> harus menjadi node root untuk file, dan dapat menyimpan satu atau beberapa elemen <item> dan <group>.
<item>
Membuat MenuItem, yang mewakili satu item dalam menu. Elemen ini dapat berisi elemen <menu> yang disusun bertingkat untuk membuat submenu.
<group>
Penampung opsional yang tidak terlihat untuk elemen <item>. Template ini memungkinkan Anda mengategorikan item menu agar memiliki properti yang sama, seperti status aktif dan visibilitas. Untuk mengetahui informasi selengkapnya, lihat bagian Membuat grup menu.

Berikut ini adalah contoh menu bernama 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>

Elemen <item> mendukung beberapa atribut yang dapat Anda gunakan untuk menentukan tampilan dan perilaku item. Item dalam menu sebelumnya menyertakan atribut berikut:

android:id
ID resource unik bagi item, yang memungkinkan aplikasi mengenali item ketika pengguna memilihnya.
android:icon
Referensi ke drawable untuk digunakan sebagai ikon item.
android:title
Referensi ke string untuk digunakan sebagai judul item.
android:showAsAction
Spesifikasi mengenai waktu dan cara item ini muncul sebagai item tindakan di panel aplikasi.

Ini adalah atribut terpenting yang Anda gunakan, tetapi banyak atribut lainnya yang tersedia. Untuk mengetahui informasi tentang semua atribut yang didukung, lihat dokumentasi Resource menu.

Anda dapat menambahkan submenu ke item di menu apa pun dengan menambahkan elemen <menu> sebagai turunan <item>. Submenu berguna jika aplikasi Anda memiliki banyak fungsi yang dapat diatur ke dalam topik, seperti item dalam panel menu aplikasi PC—seperti File, Edit, dan View. Lihat contoh berikut:

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

Untuk menggunakan menu dalam aktivitas Anda, _inflate_ resource menu, dengan mengonversi resource XML menjadi objek yang dapat diprogram menggunakan MenuInflater.inflate(). Bagian berikut menunjukkan cara meng-inflate menu untuk setiap jenis menu.

Membuat menu opsi

Menu opsi, seperti yang ditampilkan dalam gambar 1, adalah tempat Anda menyertakan tindakan dan opsi lain yang relevan dengan konteks aktivitas saat ini, seperti "Telusuri", "Tulis email", dan "Setelan".

Gambar yang menampilkan panel aplikasi untuk aplikasi Google Spreadsheet
Gambar 2. Aplikasi Google Spreadsheet, yang menampilkan beberapa tombol, termasuk tombol tindakan tambahan.

Anda dapat mendeklarasikan item untuk menu opsi dari subclass Activity atau subclass Fragment. Jika aktivitas dan fragmen Anda mendeklarasikan item untuk menu opsi, item tersebut akan digabungkan dalam UI. Item aktivitas akan muncul terlebih dahulu, diikuti oleh item setiap fragmen, sesuai dengan urutan penambahan fragmen ke aktivitas. Jika perlu, Anda dapat menyusun ulang item menu dengan atribut android:orderInCategory dalam setiap <item> yang perlu Anda pindahkan.

Untuk menentukan menu opsi suatu aktivitas, ganti onCreateOptionsMenu(). Fragmen menyediakan callback onCreateOptionsMenu()-nya sendiri. Dalam metode ini, Anda dapat meng-inflate resource menu, yang ditentukan dalam XML, menjadi Menu yang disediakan dalam callback. Hal ini ditunjukkan dalam contoh berikut:

Kotlin

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

Java

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

Anda juga dapat menambahkan item menu menggunakan add() dan mengambil item dengan findItem() untuk merevisi propertinya dengan MenuItem API.

Menangani peristiwa klik

Saat pengguna memilih item dari menu opsi, termasuk item tindakan di panel aplikasi, sistem akan memanggil metode onOptionsItemSelected() aktivitas Anda. Metode ini meneruskan MenuItem yang dipilih. Anda dapat mengidentifikasi item dengan memanggil getItemId(), yang menampilkan ID unik untuk item menu, yang ditentukan oleh atribut android:id dalam resource menu atau dengan bilangan bulat yang diberikan ke metode add(). Anda dapat mencocokkan ID ini dengan item menu yang diketahui untuk melakukan tindakan yang sesuai.

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

Java

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

Bila Anda berhasil menangani sebuah item menu, kembalikan true. Jika Anda tidak menangani item menu, panggil implementasi superclass onOptionsItemSelected(). Implementasi default menampilkan salah (false).

Jika aktivitas Anda menyertakan fragmen, sistem akan terlebih dahulu memanggil onOptionsItemSelected() untuk aktivitas tersebut, lalu untuk setiap fragmen sesuai urutan penambahan fragmen, hingga satu fragmen menampilkan true atau semua fragmen dipanggil.

Mengubah item menu saat runtime

Setelah memanggil onCreateOptionsMenu(), sistem akan mempertahankan instance Menu yang Anda isi dan tidak memanggil onCreateOptionsMenu() lagi kecuali jika menu menjadi tidak valid. Namun, gunakan onCreateOptionsMenu() hanya untuk membuat status menu awal, bukan untuk membuat perubahan selama siklus proses aktivitas.

Jika ingin mengubah menu opsi berdasarkan peristiwa yang terjadi selama siklus proses aktivitas, Anda dapat melakukannya di metode onPrepareOptionsMenu(). Metode ini meneruskan objek Menu sebagaimana adanya saat ini sehingga Anda dapat mengubahnya, misalnya dengan menambahkan, menghapus, atau menonaktifkan item. Fragmen juga menyediakan callback onPrepareOptionsMenu().

Menu opsi dianggap selalu terbuka saat item menu ditampilkan di panel aplikasi. Ketika ada peristiwa dan Anda ingin menjalankan update menu, panggil invalidateOptionsMenu() untuk meminta sistem memanggil onPrepareOptionsMenu().

Membuat menu kontekstual

Gambar yang menunjukkan menu konteks mengambang
Gambar 3. Menu konteks mengambang.

Menu kontekstual menawarkan tindakan yang memengaruhi item atau frame konteks tertentu di UI. Anda dapat menyediakan menu konteks untuk tampilan apa pun, tetapi menu tersebut paling sering digunakan untuk item dalam RecylerView atau koleksi tampilan lainnya yang memungkinkan pengguna melakukan tindakan langsung pada setiap item.

Ada dua cara menyediakan tindakan kontekstual:

  • Dalam menu konteks mengambang. Menu muncul sebagai daftar item menu mengambang, mirip dengan dialog, jika pengguna melakukan sentuh lama pada tampilan yang mendeklarasikan dukungan untuk menu konteks. Pengguna bisa melakukan tindakan kontekstual pada satu item untuk setiap kalinya.
  • Dalam mode tindakan kontekstual. Mode ini adalah implementasi sistem ActionMode yang menampilkan panel tindakan kontekstual, atau CAB, di bagian atas layar dengan item tindakan yang memengaruhi item yang dipilih. Saat mode ini aktif, pengguna dapat melakukan tindakan pada beberapa item sekaligus, jika aplikasi Anda mendukungnya.

Membuat menu konteks mengambang

Untuk menyediakan menu konteks mengambang, lakukan hal berikut:

  1. Daftarkan View yang terkait dengan menu konteks dengan memanggil registerForContextMenu() dan meneruskan View ke dalamnya.

    Jika aktivitas Anda menggunakan RecyclerView dan Anda ingin setiap item menyediakan menu konteks yang sama, daftarkan semua item untuk menu konteks dengan meneruskan RecyclerView ke registerForContextMenu().

  2. Implementasikan metode onCreateContextMenu() dalam Activity atau Fragment Anda.

    Jika tampilan yang terdaftar menerima peristiwa sentuh lama, sistem akan memanggil metode onCreateContextMenu() Anda. Di sinilah Anda menetapkan item menu, biasanya dengan meng-inflate resource menu, seperti dalam contoh berikut:

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

    Java

        @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 memungkinkan Anda meng-inflate menu konteks dari resource menu. Parameter metode callback menyertakan View yang dipilih pengguna dan objek ContextMenu.ContextMenuInfo yang memberikan informasi tambahan tentang item yang dipilih. Jika aktivitas Anda memiliki beberapa tampilan yang masing-masing menyediakan menu konteks berbeda, Anda dapat menggunakan parameter ini untuk menentukan menu konteks yang harus di-inflate.

  3. Terapkan onContextItemSelected(), seperti yang ditunjukkan dalam contoh berikut. Jika pengguna memilih item menu, sistem akan memanggil metode ini sehingga Anda dapat menjalankan tindakan yang sesuai.

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

    Java

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

    Metode getItemId() mengkueri ID untuk item menu yang dipilih, yang Anda tetapkan ke setiap item menu dalam XML menggunakan atribut android:id, seperti yang ditunjukkan dalam Menentukan menu dalam XML.

    Bila Anda berhasil menangani sebuah item menu, kembalikan true. Jika Anda tidak menangani item menu, teruskan item menu tersebut ke implementasi superclass. Jika aktivitas Anda menyertakan fragmen, aktivitas akan menerima callback ini terlebih dahulu. Dengan memanggil superclass saat tidak tertangani, sistem akan meneruskan peristiwa ke metode callback yang bersangkutan di setiap fragmen, satu per satu, sesuai dengan urutan penambahan setiap fragmen, hingga true atau false ditampilkan. Implementasi default untuk Activity dan android.app.Fragment menampilkan false, jadi selalu panggil superclass jika tidak tertangani.

Menggunakan mode tindakan kontekstual

Mode tindakan kontekstual adalah implementasi sistem ActionMode yang memfokuskan interaksi pengguna pada upaya melakukan tindakan kontekstual. Jika pengguna mengaktifkan mode ini dengan memilih item, panel tindakan kontekstual akan muncul di bagian atas layar untuk menampilkan tindakan yang dapat dilakukan pengguna pada item yang dipilih. Saat mode ini diaktifkan, pengguna dapat memilih beberapa item, jika aplikasi Anda mendukungnya, dan dapat membatalkan pilihan item serta melanjutkan navigasi dalam aktivitas. Mode tindakan dinonaktifkan dan panel tindakan kontekstual akan menghilang bila pengguna membatalkan pilihan semua item, mengetuk tombol Kembali, atau mengetuk tindakan Done di sisi kiri panel.

Untuk tampilan yang menyediakan tindakan kontekstual, Anda biasanya memanggil mode tindakan kontekstual saat salah satu atau kedua peristiwa berikut terjadi:

  • Pengguna menyentuh lama tampilan.
  • Pengguna memilih kotak centang atau komponen UI yang serupa dalam tampilan.

Cara aplikasi Anda memanggil mode tindakan kontekstual dan menentukan perilaku untuk setiap tindakan bergantung pada desain Anda. Ada dua desain:

  • Untuk tindakan kontekstual pada tampilan sembarang dan tersendiri.
  • Untuk tindakan kontekstual batch pada grup item dalam RecyclerView, memungkinkan pengguna memilih beberapa item dan melakukan tindakan pada semua item tersebut.

Bagian berikut ini menjelaskan penyiapan yang diperlukan untuk setiap skenario.

Mengaktifkan mode tindakan kontekstual untuk tampilan individual

Jika Anda ingin memanggil mode tindakan kontekstual hanya bila pengguna memilih tampilan tertentu, lakukan hal berikut:

  1. Terapkan antarmuka ActionMode.Callback seperti yang ditunjukkan dalam contoh berikut. Dalam metode callback-nya, Anda dapat menentukan tindakan untuk panel tindakan kontekstual, merespons peristiwa klik pada item tindakan, dan menangani peristiwa siklus proses lainnya untuk mode tindakan tersebut.

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

    Java

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

    Callback peristiwa ini hampir sama persis dengan callback untuk menu opsi, hanya saja setiap callback ini juga meneruskan objek ActionMode yang terkait dengan peristiwa tersebut. Anda dapat menggunakan ActionMode API untuk melakukan berbagai perubahan pada CAB, seperti merevisi judul dan subtitel dengan setTitle() dan setSubtitle(), yang berguna untuk menunjukkan jumlah item yang dipilih.

    Contoh sebelumnya menetapkan variabel actionMode ke null saat mode tindakan dihancurkan. Pada langkah berikutnya, lihat cara variabel diinisialisasi dan kegunaan menyimpan variabel anggota dalam aktivitas atau fragmen Anda.

  2. Panggil startActionMode() saat Anda ingin menampilkan panel, seperti saat pengguna menyentuh lama tampilan.

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

    Java

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

    Saat Anda memanggil startActionMode(), sistem akan menampilkan ActionMode yang dibuat. Dengan menyimpannya dalam variabel anggota, Anda dapat membuat perubahan pada panel tindakan kontekstual sebagai respons terhadap peristiwa lainnya. Dalam contoh sebelumnya, ActionMode digunakan untuk memastikan bahwa instance ActionMode tidak dibuat ulang jika sudah aktif, dengan memeriksa apakah anggota bernilai null sebelum memulai mode tindakan.

Membuat menu pop-up

Gambar yang menampilkan menu pop-up di aplikasi Gmail, yang dikaitkan ke tombol tambahan di kanan atas.
Gambar 4. Menu pop-up dalam aplikasi Gmail, dikaitkan pada tombol tambahan di pojok kanan atas.

PopupMenu adalah menu modal yang dikaitkan ke View. Panel ini muncul di bawah tampilan anchor jika ada ruang, atau di atas tampilan jika tidak ada. Hal ini berguna untuk hal berikut:

  • Menyediakan menu bergaya tambahan untuk tindakan yang berkaitan dengan konten tertentu, seperti header email Gmail, yang ditunjukkan dalam gambar 4.
  • Menyediakan bagian kedua dari kalimat perintah, seperti tombol bertanda Add yang menghasilkan menu pop-up dengan opsi Add yang berbeda.
  • Menyediakan menu yang mirip dengan Spinner yang tidak mempertahankan pilihan persisten.

Jika Anda menentukan menu dalam XML, berikut ini cara menampilkan menu pop-up:

  1. Buat instance PopupMenu bersama konstruktornya, yang mengambil Context aplikasi saat ini dan View tempat menu ditambatkan.
  2. Gunakan MenuInflater untuk meng-inflate resource menu Anda ke dalam objek Menu yang ditampilkan oleh PopupMenu.getMenu().
  3. Panggil PopupMenu.show().

Misalnya, berikut adalah tombol yang menampilkan menu pop-up:

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

Aktivitas nanti dapat menampilkan menu pop-up seperti ini:

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

Java

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

Menu ditutup jika pengguna memilih item atau mengetuk di luar area menu. Anda dapat memproses peristiwa tutup menggunakan PopupMenu.OnDismissListener.

Menangani peristiwa klik

Untuk menjalankan tindakan saat pengguna memilih item menu, implementasikan antarmuka PopupMenu.OnMenuItemClickListener dan daftarkan dengan PopupMenu dengan memanggil setOnMenuItemclickListener(). Saat pengguna memilih item, sistem akan memanggil callback onMenuItemClick() di antarmuka Anda.

Hal ini ditunjukkan dalam contoh berikut:

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

Java

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

Membuat grup menu

Grup menu adalah sekumpulan item menu yang sama-sama memiliki ciri (trait) tertentu. Dengan grup, Anda dapat melakukan hal berikut:

Anda dapat membuat grup dengan menyarangkan elemen <item> di dalam elemen <group> di resource menu atau dengan menentukan ID grup dengan metode add().

Berikut adalah contoh resource menu yang berisi sebuah grup:

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

Item yang ada dalam grup akan muncul pada level yang sama dengan item pertama—ketiga item dalam menu adalah bersaudara. Namun, Anda dapat mengubah ciri kedua item dalam grup tersebut dengan merujuk ID grup dan menggunakan metode sebelumnya. Sistem juga tidak pernah memisahkan item yang dikelompokkan. Misalnya, jika Anda mendeklarasikan android:showAsAction="ifRoom" untuk setiap item, item tersebut akan muncul dalam panel tindakan atau keduanya muncul dalam tindakan tambahan.

Menggunakan item menu yang dapat dicentang

Gambar 5. Submenu dengan item yang dapat dicentang.

Menu dapat berguna sebagai antarmuka untuk mengaktifkan dan menonaktifkan opsi, menggunakan kotak centang untuk opsi mandiri, atau tombol pilihan untuk grup opsi yang saling eksklusif. Gambar 5 menunjukkan submenu dengan item yang dapat dicentang dengan tombol pilihan.

Anda dapat menentukan perilaku yang dapat dicentang untuk setiap item menu menggunakan atribut android:checkable dalam elemen <item>, atau untuk seluruh kelompok dengan atribut android:checkableBehavior dalam elemen <group>. Misalnya, semua item dalam grup menu ini dapat dicentang dengan tombol pilihan:

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

Atribut android:checkableBehavior menerima salah satu dari hal berikut:

single
Hanya satu item dari grup ini yang dapat dicentang, sehingga menampilkan tombol pilihan.
all
Semua item dapat dicentang, sehingga akan muncul kotak centang.
none
Tidak ada item yang bisa dicentang.

Anda dapat menerapkan status dicentang default pada suatu item menggunakan atribut android:checked dalam elemen <item> dan mengubahnya dalam kode dengan metode setChecked().

Ketika item yang dapat dicentang dipilih, sistem akan memanggil metode callback masing-masing item yang dipilih, seperti onOptionsItemSelected(). Di sinilah Anda menetapkan status kotak centang, karena kotak centang atau tombol radio tidak mengubah statusnya secara otomatis. Anda dapat membuat kueri status item saat ini—seperti sebelum pengguna memilihnya—dengan isChecked(), lalu menetapkan status yang dicentang dengan setChecked(). Hal ini ditunjukkan dalam contoh berikut:

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

Java

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

Jika Anda tidak menetapkan status yang dicentang dengan cara ini, status kotak centang atau tombol pilihan yang terlihat tidak akan berubah saat pengguna memilihnya. Saat Anda menetapkan status, aktivitas akan mempertahankan status item yang dicentang sehingga saat pengguna nanti membuka menu, status dicentang yang Anda setel akan terlihat.

Menambahkan item menu berdasarkan intent

Terkadang Anda ingin item menu meluncurkan aktivitas menggunakan Intent, baik aktivitas tersebut di aplikasi Anda maupun aplikasi lain. Jika Anda mengetahui intent yang ingin digunakan dan memiliki item menu tertentu yang memulai intent, Anda dapat mengeksekusi intent dengan startActivity() selama metode callback pada item yang dipilih, seperti callback onOptionsItemSelected().

Namun, jika Anda tidak yakin bahwa perangkat pengguna berisi aplikasi yang menangani intent, menambahkan item menu yang memanggilnya dapat menyebabkan item menu tidak berfungsi, karena intent mungkin tidak di-resolve ke aktivitas. Untuk mengatasi hal ini, Android memungkinkan Anda menambahkan item menu secara dinamis ke menu saat Android menemukan aktivitas di perangkat yang menangani intent Anda.

Untuk menambahkan item menu berdasarkan aktivitas tersedia yang menerima intent, lakukan hal berikut:

  1. Tentukan intent dengan kategori CATEGORY_ALTERNATIVE atau CATEGORY_SELECTED_ALTERNATIVE, atau keduanya, ditambah persyaratan lainnya.
  2. Panggil Menu.addIntentOptions(). Android kemudian akan menelusuri setiap aplikasi yang dapat melakukan intent dan menambahkannya ke menu Anda.

Jika tidak ada aplikasi terinstal yang memenuhi intent, tidak ada item menu yang ditambahkan.

Hal ini ditunjukkan dalam contoh berikut:

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
}

Java

@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;
}

Untuk setiap aktivitas yang ditemukan menyediakan filter intent yang cocok dengan intent yang ditentukan, item menu akan ditambahkan, menggunakan nilai dalam android:label filter intent sebagai judul item menu dan ikon aplikasi sebagai ikon item menu. Metode addIntentOptions() menampilkan jumlah item menu yang ditambahkan.

Memungkinkan aktivitas Anda ditambahkan ke menu lain

Anda dapat menawarkan layanan aktivitas Anda ke aplikasi lain sehingga aplikasi dapat disertakan dalam menu aplikasi lain dengan membalikkan peran yang dijelaskan sebelumnya.

Untuk disertakan dalam menu aplikasi lain, tentukan filter intent seperti biasa, tetapi sertakan nilai CATEGORY_ALTERNATIVE atau CATEGORY_SELECTED_ALTERNATIVE, atau keduanya, untuk kategori filter intent. Hal ini ditunjukkan dalam contoh berikut:

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

Baca selengkapnya tentang cara menulis filter intent di Intent dan filter intent.