Menu adalah komponen antarmuka pengguna yang umum di banyak jenis aplikasi. Untuk
memberikan pengalaman pengguna yang sudah dikenal dan konsisten, gunakan
Menu
API untuk
menyajikan tindakan pengguna dan opsi lainnya dalam aktivitas Anda.
Dokumen ini menunjukkan cara membuat tiga tipe dasar penyajian menu atau tindakan pada semua versi Android:
- Menu opsi dan panel aplikasi
- Menu opsi adalah kumpulan utama item menu untuk suatu
aktivitas. Di sini 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 melakukan sentuhan lama pada 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. Ini cocok untuk menyediakan kelebihan tindakan
yang terkait dengan konten tertentu atau untuk menyediakan opsi untuk bagian kedua
suatu perintah. Tindakan di menu pop-up tidak secara langsung memengaruhi
konten yang bersangkutan—karena itulah fungsi kontekstual untuk tindakan. 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 sumber daya 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.
- Cara 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 menampung satu atau beberapa elemen<item>
dan<group>
. <item>
- Membuat
MenuItem
, yang mewakili satu item dalam menu. Elemen ini dapat berisi elemen<menu>
bertingkat untuk membuat submenu. <group>
- Container opsional yang tak terlihat untuk elemen-elemen
<item>
. Fitur ini memungkinkan Anda mengategorikan item menu agar berbagi properti, 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 saat 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 untuk waktu dan cara item ini muncul sebagai item tindakan di panel aplikasi.
Ini adalah atribut terpenting yang Anda gunakan, tetapi masih banyak lagi yang tersedia. Untuk mengetahui informasi tentang semua atribut yang didukung, lihat dokumentasi Resource menu.
Anda dapat menambahkan submenu ke sebuah item di menu apa saja dengan menambahkan
elemen <menu>
sebagai turunan <item>
.
Submenu berguna saat aplikasi Anda memiliki banyak fungsi yang dapat diatur
ke dalam topik, seperti item di 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, konversikan
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".

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 dikombinasikan di 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
di setiap
<item>
yang perlu dipindahkan.
Untuk menentukan menu opsi suatu aktivitas, ganti
onCreateOptionsMenu()
.
Fragmen menyediakan callback
onCreateOptionsMenu()
sendiri. Dalam metode ini, Anda dapat meng-inflate resource menu,
yang ditentukan dalam XML, ke 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 nilai salah (false).
Jika aktivitas Anda menyertakan fragmen, sistem terlebih dahulu akan memanggil
onOptionsItemSelected()
untuk aktivitas tersebut, lalu untuk setiap fragmen
sesuai dengan 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 dibatalkan.
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, seperti dengan menambahkan, menghapus, atau menonaktifkan item.
Fragmen juga menyediakan
callback
onPrepareOptionsMenu()
.
Menu opsi dianggap selalu terbuka saat item menu ditampilkan di
panel aplikasi. Bila ada peristiwa dan Anda ingin melakukan pembaruan menu, panggil
invalidateOptionsMenu()
untuk meminta sistem memanggil onPrepareOptionsMenu()
.
Membuat menu kontekstual
Menu kontekstual menawarkan tindakan yang memengaruhi item atau frame
konteks tertentu di UI. Anda dapat menyediakan menu konteks untuk tampilan apa pun, tetapi menu ini paling
sering digunakan untuk item dalam
RecylerView
atau
koleksi tampilan lainnya tempat pengguna dapat 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, ketika pengguna melakukan sentuhan 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:
- Daftarkan
View
yang terkait dengan menu konteks dengan memanggilregisterForContextMenu()
dan meneruskanView
ke dalamnya.Jika aktivitas Anda menggunakan
RecyclerView
dan Anda ingin setiap item menyediakan menu konteks yang sama, daftarkan semua item ke menu konteks dengan meneruskanRecyclerView
keregisterForContextMenu()
. - Implementasikan metode
onCreateContextMenu()
dalamActivity
atauFragment
.Saat tampilan yang terdaftar menerima peristiwa sentuh lama, sistem akan memanggil metode
onCreateContextMenu()
Anda. Di sinilah Anda menentukan 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 menyertakanView
yang dipilih pengguna dan objekContextMenu.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 mana yang harus di-inflate. Terapkan
onContextItemSelected()
, seperti yang ditunjukkan dalam contoh berikut. Saat pengguna memilih item menu, sistem akan memanggil metode ini sehingga Anda dapat melakukan 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 atributandroid: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 ke implementasi superclass. Jika aktivitas Anda menyertakan fragmen, aktivitas akan menerima callback ini terlebih dahulu. Dengan memanggil superclass saat tidak ditangani, sistem akan meneruskan peristiwa ke metode callback yang bersangkutan di setiap fragmen, satu per satu waktu, sesuai dengan urutan penambahan setiap fragmen, hinggatrue
ataufalse
ditampilkan. Implementasi default untukActivity
danandroid.app.Fragment
menampilkanfalse
, jadi selalu panggil superclass jika tidak ditangani.
Menggunakan mode tindakan kontekstual
Mode tindakan kontekstual adalah implementasi sistem
ActionMode
yang memfokuskan interaksi pengguna pada upaya melakukan
tindakan kontekstual. Saat 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 terus melakukan navigasi dalam aktivitas. Mode tindakan dinonaktifkan
dan panel tindakan kontekstual 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 melakukan sentuh lama pada tampilan.
- Pengguna memilih kotak centang atau komponen UI yang serupa dalam tampilan.
Cara aplikasi 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 kelompok item dalam
RecyclerView
, yang 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:
- 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 menggunakanActionMode
API untuk membuat berbagai perubahan pada CAB, seperti merevisi judul dan subtitel dengansetTitle()
dansetSubtitle()
, yang berguna untuk menunjukkan jumlah item yang dipilih.Contoh sebelumnya menetapkan variabel
actionMode
kenull
ketika mode tindakan dihancurkan. Pada langkah berikutnya, lihat cara variabel diinisialisasi dan kegunaan menyimpan variabel anggota dalam aktivitas atau fragmen Anda. - Panggil
startActionMode()
jika Anda ingin menampilkan panel, seperti saat pengguna melakukan sentuh lama pada 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 menampilkanActionMode
yang dibuat. Dengan menyimpannya dalam variabel anggota, Anda dapat membuat perubahan pada panel tindakan kontekstual sebagai respons terhadap peristiwa lainnya. Pada contoh sebelumnya,ActionMode
digunakan untuk memastikan bahwa instanceActionMode
tidak dibuat ulang jika sudah aktif, dengan memeriksa apakah anggota bernilai null sebelum memulai mode tindakan.
Membuat menu pop-up

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 kelebihan (overflow) untuk tindakan yang berkaitan dengan konten tertentu, seperti header email Gmail, yang ditampilkan dalam gambar 4.
- Menyediakan bagian kedua dari kalimat perintah, seperti tombol bertanda Add yang menghasilkan menu pop-up dengan berbagai opsi Add.
- Menyediakan menu mirip dengan
Spinner
yang tidak mempertahankan pilihan persisten.
Jika Anda menentukan menu dalam XML, berikut ini cara menampilkan menu pop-up:
- Buat instance
PopupMenu
dengan konstruktornya, yang mengambilContext
aplikasi saat ini danView
tempat menu ditambatkan. - Gunakan
MenuInflater
untuk meng-inflate resource menu Anda ke dalam objekMenu
yang ditampilkan olehPopupMenu.getMenu()
. - 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 akan ditutup saat pengguna memilih item atau mengetuk di luar area
menu. Anda dapat memproses peristiwa penutupan menggunakan
PopupMenu.OnDismissListener
.
Menangani peristiwa klik
Untuk melakukan 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; } }
Buat grup menu
Grup menu adalah sekumpulan item menu yang sama-sama memiliki ciri (trait) tertentu. Dengan grup, Anda dapat melakukan hal berikut:
- Tampilkan atau sembunyikan semua item menggunakan
setGroupVisible()
. - Aktifkan atau nonaktifkan semua item menggunakan
setGroupEnabled()
. - Menentukan apakah semua item dapat dicentang menggunakan
setGroupCheckable()
.
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 dengan mereferensikan ID grup dan menggunakan
metode sebelumnya. Sistem juga tidak pernah memisahkan item yang dikelompokkan. Misalnya, jika Anda mendeklarasikan android:showAsAction="ifRoom"
untuk setiap
item, keduanya akan muncul dalam panel tindakan atau keduanya muncul dalam tindakan
overflow.
Menggunakan item menu 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 dengan menggunakan
atribut android:checkable
dalam elemen <item>
, atau untuk seluruh grup 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 hal
berikut:
single
- Hanya satu item dari grup yang dapat dicentang, sehingga menghasilkan tombol pilihan.
all
- Semua item dapat dicentang, sehingga menghasilkan kotak centang.
none
- Tidak ada item yang dapat dicentang.
Anda dapat menerapkan status dicentang default pada suatu item menggunakan
atribut android:checked
dalam elemen <item>
dan mengubahnya dalam kode dengan
metode
setChecked()
.
Jika item yang dapat dicentang dipilih, sistem akan memanggil metode callback
setiap 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 mengkueri 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. Jika Anda menetapkan status, aktivitas akan mempertahankan status item yang dicentang sehingga saat pengguna membuka menu nanti, status dicentang yang Anda setel akan terlihat.
Menambahkan item menu berdasarkan intent
Terkadang, Anda ingin item menu meluncurkan aktivitas menggunakan
Intent
,
baik aktivitas 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 saat item dipilih yang sesuai, seperti
callback onOptionsItemSelected()
.
Namun, jika Anda tidak yakin bahwa perangkat pengguna berisi aplikasi yang menangani intent, menambahkan item menu yang memanggilnya dapat mengakibatkan item menu tidak berfungsi, karena intent mungkin tidak di-resolve menjadi aktivitas. Untuk mengatasi hal ini, Android memungkinkan Anda menambahkan item menu secara dinamis ke menu Anda saat Android menemukan aktivitas di perangkat yang menangani intent Anda.
Untuk menambahkan item menu berdasarkan aktivitas yang tersedia dan menerima intent, lakukan hal berikut:
- Tentukan intent dengan kategori
CATEGORY_ALTERNATIVE
atauCATEGORY_SELECTED_ALTERNATIVE
, atau keduanya, ditambah persyaratan lainnya. - Panggil
Menu.addIntentOptions()
. Android kemudian akan menelusuri aplikasi apa pun yang dapat menjalankan 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 diketahui 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.
Mengizinkan 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.
Agar 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 penulisan filter intent di Intent dan filter intent.