1 page.title=Menu 2 parent.title=Antarmuka Pengguna 3 parent.link=index.html 4 @jd:body 5 6 <div id="qv-wrapper"> 7 <div id="qv"> 8 <h2>Dalam dokumen ini</h2> 9 <ol> 10 <li><a href="#xml">Mendefinisikan Menu dalam XML</a></li> 11 <li><a href="#options-menu">Membuat Menu Opsi</a> 12 <ol> 13 <li><a href="#RespondingOptionsMenu">Menangani kejadian klik</a></li> 14 <li><a href="#ChangingTheMenu">Mengubah item menu saat runtime</a></li> 15 </ol> 16 </li> 17 <li><a href="#context-menu">Membuat Menu Kontekstual</a> 18 <ol> 19 <li><a href="#FloatingContextMenu">Membuat menu konteks mengambang</a></li> 20 <li><a href="#CAB">Menggunakan mode tindakan kontekstual</a></li> 21 </ol> 22 </li> 23 <li><a href="#PopupMenu">Membuat Menu Popup</a> 24 <ol> 25 <li><a href="#PopupEvents">Menangani kejadian klik</a></li> 26 </ol> 27 </li> 28 <li><a href="#groups">Membuat Grup Menu</a> 29 <ol> 30 <li><a href="#checkable">Menggunakan item menu yang bisa diberi tanda cek</a></li> 31 </ol> 32 </li> 33 <li><a href="#intents">Menambahkan Item Menu Berdasarkan Intent</a> 34 <ol> 35 <li><a href="#AllowingToAdd">Memungkinkan aktivitas Anda ditambahkan ke menu lain</a></li> 36 </ol> 37 </li> 38 </ol> 39 40 <h2>Kelas-kelas utama</h2> 41 <ol> 42 <li>{@link android.view.Menu}</li> 43 <li>{@link android.view.MenuItem}</li> 44 <li>{@link android.view.ContextMenu}</li> 45 <li>{@link android.view.ActionMode}</li> 46 </ol> 47 48 <h2>Lihat juga</h2> 49 <ol> 50 <li><a href="{@docRoot}guide/topics/ui/actionbar.html">Action-Bar</a></li> 51 <li><a href="{@docRoot}guide/topics/resources/menu-resource.html">Sumber Daya Menu</a></li> 52 <li><a href="http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html">Ucapkan 53 Selamat Tinggal pada Tombol Menu</a></li> 54 </ol> 55 </div> 56 </div> 57 58 <p>Menu adalah komponen antarmuka pengguna yang lazim dalam banyak tipe aplikasi. Untuk menyediakan pengalaman pengguna yang sudah akrab 59 dan konsisten, Anda harus menggunakan API {@link android.view.Menu} untuk menyajikan 60 tindakan dan opsi lain dalam aktivitas kepada pengguna.</p> 61 62 <p>Mulai dengan Android 3.0 (API level 11), perangkat berbasis Android tidak perlu lagi 63 menyediakan tombol <em>Menu</em> tersendiri. Dengan perubahan ini, aplikasi Android harus bermigrasi dari 64 dependensi pada panel menu 6 item biasa, dan sebagai ganti menyediakan action-bar untuk menyajikan 65 berbagai tindakan pengguna yang lazim.</p> 66 67 <p>Walaupun desain dan pengalaman pengguna untuk sebagian item menu telah berubah, semantik untuk mendefinisikan 68 serangkaian tindakan dan opsi masih berdasarkan pada API {@link android.view.Menu}. Panduan ini 69 menampilkan cara membuat tiga tipe dasar penyajian menu atau tindakan pada semua 70 versi Android:</p> 71 72 <dl> 73 <dt><strong>Menu opsi dan action-bar</strong></dt> 74 <dd><a href="#options-menu">Menu opsi</a> adalah kumpulan item menu utama untuk suatu 75 aktivitas. Inilah tempat Anda harus menempatkan tindakan yang berdampak global pada aplikasi, seperti 76 "Cari", "Tulis email", dan "Pengaturan". 77 <p>Jika Anda mengembangkan aplikasi untuk Android 2.3 atau yang lebih rendah, pengguna bisa 78 menampilkan panel menu opsi dengan menekan tombol <em>Menu</em>.</p> 79 <p>Pada Android 3.0 dan yang lebih tinggi, item menu opsi disajikan melalui <a href="{@docRoot}guide/topics/ui/actionbar.html">action-bar</a> sebagai kombinasi item tindakan 80 di layar dan opsi overflow. Mulai dengan Android 3.0, tombol <em>Menu</em> dihilangkan (sebagian 81 perangkat 82 tidak memilikinya), sehingga Anda harus bermigrasi ke penggunaan action-bar untuk menyediakan akses ke tindakan dan 83 opsi lainnya.</p> 84 <p>Lihat bagian tentang <a href="#options-menu">Membuat Menu Opsi</a>.</p> 85 </dd> 86 87 <dt><strong>Menu konteks dan mode tindakan kontekstual</strong></dt> 88 89 <dd>Menu konteks adalah <a href="#FloatingContextMenu">menu mengambang</a> yang muncul saat 90 pengguna mengklik lama pada suatu elemen. Menu ini menyediakan tindakan yang memengaruhi konten atau 91 bingkai konteks yang dipilih. 92 <p>Saat mengembangkan aplikasi untuk Android 3.0 dan yang lebih tinggi, sebagai gantinya Anda harus menggunakan <a href="#CAB">mode tindakan kontekstual</a> untuk memungkinkan tindakan pada konten yang dipilih. Mode ini menampilkan 93 item tindakan yang memengaruhi konten yang dipilih dalam baris di bagian atas layar dan memungkinkan pengguna 94 memilih beberapa item sekaligus.</p> 95 <p>Lihat bagian tentang <a href="#context-menu">Membuat Menu Kontekstual</a>.</p> 96 </dd> 97 98 <dt><strong>Menu popup</strong></dt> 99 <dd>Menu popup menampilkan daftar item secara vertikal yang dipasang pada tampilan yang 100 memanggil menu. Ini cocok untuk menyediakan kelebihan tindakan yang terkait dengan konten tertentu atau 101 untuk menyediakan opsi bagi bagian kedua dari suatu perintah. Tindakan di menu popup 102 <strong>tidak</strong> boleh memengaruhi secara langsung konten yang bersangkutan—yang diperuntukkan bagi 103 tindakan kontekstual. Melainkan, menu popup adalah untuk tindakan tambahan yang terkait dengan wilayah konten dalam 104 aktivitas Anda. 105 <p>Lihat bagian tentang <a href="#PopupMenu">Membuat Menu Popup</a>.</p> 106 </dd> 107 </dl> 108 109 110 111 <h2 id="xml">Mendefinisikan Menu dalam XML</h2> 112 113 <p>Untuk semua tipe menu, Android menyediakan sebuah format XML standar untuk mendefinisikan item menu. 114 Sebagai ganti membuat menu dalam kode aktivitas, Anda harus mendefinisikan menu dan semua itemnya dalam 115 <a href="{@docRoot}guide/topics/resources/menu-resource.html">sumber daya menu</a> XML. Anda kemudian bisa 116 memekarkan sumber daya menu (memuatnya sebagai objek {@link android.view.Menu}) dalam aktivitas atau 117 fragmen.</p> 118 119 <p>Menggunakan sumber daya menu adalah praktik yang baik karena beberapa alasan:</p> 120 <ul> 121 <li>Memvisualisasikan struktur menu dalam XML menjadi lebih mudah.</li> 122 <li>Cara ini memisahkan konten untuk menu dari kode perilaku aplikasi Anda.</li> 123 <li>Cara ini memungkinkan Anda membuat konfigurasi menu alternatif untuk berbagai versi platform, 124 ukuran layar, dan konfigurasi lainnya dengan memanfaatkan kerangka kerja <a href="{@docRoot}guide/topics/resources/index.html">sumber daya aplikasi</a>.</li> 125 </ul> 126 127 <p>Untuk mendefinisikan menu, buatlah sebuah file XML dalam direktori <code>res/menu/</code> 128 proyek dan buat menu dengan elemen-elemen berikut:</p> 129 <dl> 130 <dt><code><menu></code></dt> 131 <dd>Mendefinisikan {@link android.view.Menu}, yang merupakan sebuah kontainer untuk item menu. Elemen 132 <code><menu></code> harus menjadi simpul akar untuk file dan bisa menampung salah satu atau beberapa dari elemen 133 <code><item></code> dan <code><group></code>.</dd> 134 135 <dt><code><item></code></dt> 136 <dd>Membuat {@link android.view.MenuItem}, yang mewakili satu item menu. Elemen ini 137 bisa berisi elemen <code><menu></code> tersarang guna untuk membuat submenu.</dd> 138 139 <dt><code><group></code></dt> 140 <dd>Kontainer opsional tak terlihat untuk elemen-elemen {@code <item>}. Kontainer ini memungkinkan Anda 141 mengelompokkan item menu untuk berbagi properti seperti status aktif dan visibilitas. Untuk informasi 142 selengkapnya, lihat bagian tentang <a href="#groups">Membuat Grup Menu</a>.</dd> 143 </dl> 144 145 146 <p>Berikut ini adalah contoh menu bernama <code>game_menu.xml</code>:</p> 147 <pre> 148 <?xml version="1.0" encoding="utf-8"?> 149 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 150 <item android:id="@+id/new_game" 151 android:icon="@drawable/ic_new_game" 152 android:title="@string/new_game" 153 android:showAsAction="ifRoom"/> 154 <item android:id="@+id/help" 155 android:icon="@drawable/ic_help" 156 android:title="@string/help" /> 157 </menu> 158 </pre> 159 160 <p>Elemen <code><item></code> mendukung beberapa atribut yang bisa Anda gunakan untuk mendefinisikan penampilan dan perilaku 161 item. Item menu di atas mencakup atribut berikut:</p> 162 163 <dl> 164 <dt>{@code android:id}</dt> 165 <dd>ID sumber daya unik bagi item, yang memungkinkan aplikasi mengenali item 166 bila pengguna memilihnya.</dd> 167 <dt>{@code android:icon}</dt> 168 <dd>Acuan ke drawable untuk digunakan sebagai ikon item.</dd> 169 <dt>{@code android:title}</dt> 170 <dd>Acuan ke string untuk digunakan sebagai judul item.</dd> 171 <dt>{@code android:showAsAction}</dt> 172 <dd>Menetapkan waktu dan cara item ini muncul sebagai item tindakan di <a href="{@docRoot}guide/topics/ui/actionbar.html">action-bar</a>.</dd> 173 </dl> 174 175 <p>Ini adalah atribut-atribut terpenting yang harus Anda gunakan, namun banyak lagi yang tersedia. 176 Untuk informasi tentang semua atribut yang didukung, lihat dokumen <a href="{@docRoot}guide/topics/resources/menu-resource.html">Sumber Daya Menu</a>.</p> 177 178 <p>Anda bisa menambahkan submenu ke sebuah item di menu (kecuali submenu) apa saja dengan menambahkan elemen {@code <menu>} 179 sebagai anak {@code <item>}. Submenu berguna saat aplikasi Anda memiliki banyak 180 fungsi yang bisa ditata ke dalam topik-topik, seperti item dalam sebuah baris menu aplikasi PC (File, 181 Edit, Lihat, dsb.). Misalnya:</p> 182 183 <pre> 184 <?xml version="1.0" encoding="utf-8"?> 185 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 186 <item android:id="@+id/file" 187 android:title="@string/file" > 188 <!-- "file" submenu --> 189 <menu> 190 <item android:id="@+id/create_new" 191 android:title="@string/create_new" /> 192 <item android:id="@+id/open" 193 android:title="@string/open" /> 194 </menu> 195 </item> 196 </menu> 197 </pre> 198 199 <p>Untuk menggunakan menu dalam aktivitas, Anda perlu memekarkan sumber daya menu (mengonversi sumber daya XML 200 menjadi objek yang bisa diprogram) dengan menggunakan {@link android.view.MenuInflater#inflate(int,Menu) 201 MenuInflater.inflate()}. Di bagian berikut, Anda akan melihat cara memekarkan menu untuk tiap 202 tipe menu.</p> 203 204 205 206 <h2 id="options-menu">Membuat Menu Opsi</h2> 207 208 <div class="figure" style="width:200px;margin:0"> 209 <img src="{@docRoot}images/options_menu.png" height="333" alt="" /> 210 <p class="img-caption"><strong>Gambar 1.</strong> Menu opsi di 211 Browser, pada Android 2.3.</p> 212 </div> 213 214 <p>Menu opsi adalah tempat Anda harus menyertakan tindakan dan opsi lain yang relevan dengan 215 konteks aktivitas saat ini, seperti "Cari", "Tulis email", dan "Pengaturan".</p> 216 217 <p>Tempat item dalam menu opsi muncul di layar bergantung pada versi aplikasi yang Anda 218 kembangkan:</p> 219 220 <ul> 221 <li>Jika Anda mengembangkan aplikasi untuk <strong>Android 2.3.x (API level 10) atau 222 yang lebih rendah</strong>, konten menu opsi muncul pada bagian bawah layar bila pengguna 223 menekan tombol <em>Menu</em>, seperti yang ditampilkan dalam gambar 1. Bila dibuka, bagian yang terlihat pertama adalah 224 menu 225 ikon, yang menampung hingga enam item menu. Jika menu Anda menyertakan lebih dari enam item, Android akan meletakkan 226 item keenam dan sisanya ke dalam menu kelebihan, yang bisa dibuka pengguna dengan memilih 227 <em>More</em>.</li> 228 229 <li>Jika Anda mengembangkan aplikasi untuk <strong>Android 3.0 (API level 11) dan 230 yang lebih tinggi</strong>, item menu opsi tersedia dalam <a href="{@docRoot}guide/topics/ui/actionbar.html">action-bar</a>. Secara default, sistem 231 meletakkan semua item dalam kelebihan tindakan, yang bisa ditampilkan pengguna dengan ikon kelebihan tindakan di 232 sisi kanan action-bar (atau dengan menekan tombol <em>Menu</em> perangkat, jika tersedia). Untuk 233 mengaktifkan 234 akses cepat ke tindakan penting, Anda bisa mempromosikan beberapa item agar muncul pada action-bar dengan menambahkan 235 {@code android:showAsAction="ifRoom"} ke elemen-elemen {@code <item>} yang bersangkutan (lihat gambar 236 2). <p>Untuk informasi selengkapnya tentang item tindakan dan perilaku action-bar lainnya, lihat panduan <a href="{@docRoot}guide/topics/ui/actionbar.html">Action-Bar</a>. </p> 237 <p class="note"><strong>Catatan:</strong> Sekalipun Anda <em>tidak</em> mengembangkan aplikasi untuk Android 3.0 atau 238 yang lebih tinggi, Anda bisa membuat layout action-bar sendiri untuk mendapatkan efek serupa. Untuk contoh cara 239 mendukung versi Android yang lebih lama dengan action-bar, lihat contoh <a href="{@docRoot}resources/samples/ActionBarCompat/index.html">Kompatibilitas Action-Bar</a> 240 .</p> 241 </li> 242 </ul> 243 244 <img src="{@docRoot}images/ui/actionbar.png" alt="" /> 245 <p class="img-caption"><strong>Gambar 2.</strong> Action-bar dari aplikasi <a href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a>, yang menampilkan 246 tab-tab navigasi dan item tindakan kamera (plus tombol kelebihan tindakan).</p> 247 248 <p>Anda bisa mendeklarasikan item untuk menu opsi dari subkelas {@link android.app.Activity} 249 atau subkelas {@link android.app.Fragment}. Jika aktivitas maupun fragmen Anda 250 mendeklarasikan item menu opsi, keduanya akan dikombinasikan dalam UI. Item aktivitas akan muncul 251 lebih dahulu, diikuti oleh item tiap fragmen sesuai dengan urutan penambahan fragmen ke 252 aktivitas. Jika perlu, Anda bisa menyusun ulang item menu dengan atribut {@code android:orderInCategory} 253 dalam setiap {@code <item>} yang perlu Anda pindahkan.</p> 254 255 <p>Untuk menetapkan menu opsi suatu aktivitas, kesampingkan {@link 256 android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} (fragmen-fragmen menyediakan 257 callback {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()} sendiri). Dalam metode ini 258 , Anda bisa memekarkan sumber daya menu (<a href="#xml">yang didefinisikan dalam XML</a>) menjadi {@link 259 android.view.Menu} yang disediakan dalam callback. Misalnya:</p> 260 261 <pre> 262 @Override 263 public boolean onCreateOptionsMenu(Menu menu) { 264 MenuInflater inflater = {@link android.app.Activity#getMenuInflater()}; 265 inflater.inflate(R.menu.game_menu, menu); 266 return true; 267 } 268 </pre> 269 270 <p>Anda juga bisa menambahkan item menu dengan menggunakan {@link android.view.Menu#add(int,int,int,int) 271 add()} dan mengambil item dengan {@link android.view.Menu#findItem findItem()} untuk merevisi propertinya 272 dengan API {@link android.view.MenuItem}.</p> 273 274 <p>Jika Anda mengembangkan aplikasi untuk Android 2.3.x dan yang lebih rendah, sistem akan memanggil {@link 275 android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} untuk membuat menu opsi 276 bila pengguna membuka menu untuk pertama kali. Jika Anda mengembangkan aplikasi untuk Android 3.0 dan yang lebih tinggi, 277 sistem akan memanggil {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} saat 278 memulai aktivitas, untuk menampilkan item menu pada action-bar.</p> 279 280 281 282 <h3 id="RespondingOptionsMenu">Menangani kejadian klik</h3> 283 284 <p>Bila pengguna memilih item dari menu opsi (termasuk item tindakan dalam action-bar), 285 sistem akan memanggil metode {@link android.app.Activity#onOptionsItemSelected(MenuItem) 286 onOptionsItemSelected()} aktivitas Anda. Metode ini meneruskan {@link android.view.MenuItem} yang dipilih. Anda 287 bisa mengidentifikasi item dengan memanggil {@link android.view.MenuItem#getItemId()}, yang menghasilkan 288 ID unik untuk item menu itu (yang didefinisikan oleh atribut {@code android:id} dalam sumber daya menu atau dengan 289 integer yang diberikan ke metode {@link android.view.Menu#add(int,int,int,int) add()}). Anda bisa mencocokkan 290 ID ini dengan item menu yang diketahui untuk melakukan tindakan yang sesuai. Misalnya:</p> 291 292 <pre> 293 @Override 294 public boolean onOptionsItemSelected(MenuItem item) { 295 // Handle item selection 296 switch (item.getItemId()) { 297 case R.id.new_game: 298 newGame(); 299 return true; 300 case R.id.help: 301 showHelp(); 302 return true; 303 default: 304 return super.onOptionsItemSelected(item); 305 } 306 } 307 </pre> 308 309 <p>Bila Anda berhasil menangani sebuah item menu, kembalikan {@code true}. Jika tidak menangani item menu 310 , Anda harus memanggil implementasi superkelas {@link 311 android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} (implementasi default 312 menghasilkan false).</p> 313 314 <p>Jika aktivitas Anda menyertakan fragmen, sistem akan memanggil lebih dahulu {@link 315 android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} untuk aktivitas, kemudian 316 untuk setiap fragmen (sesuai dengan urutan penambahan fragmen) hingga satu fragmen mengembalikan 317 {@code true} atau semua fragmen telah dipanggil.</p> 318 319 <p class="note"><strong>Tip:</strong> Android 3.0 menambahkan kemampuan mendefinisikan perilaku on-click 320 untuk item menu dalam XML, dengan menggunakan atribut {@code android:onClick}. Nilai atribut 321 harus berupa nama metode yang didefinisikan aktivitas dengan menggunakan menu. Metode 322 harus bersifat publik dan menerima satu parameter {@link android.view.MenuItem}—bila sistem 323 memanggilnya, metode ini akan meneruskan item menu yang dipilih. Untuk informasi selengkapnya dan contoh, lihat dokumen <a href="{@docRoot}guide/topics/resources/menu-resource.html">Sumber Daya Menu</a>.</p> 324 325 <p class="note"><strong>Tip:</strong> Jika aplikasi Anda berisi banyak aktivitas dan 326 sebagian menyediakan menu opsi yang sama, pertimbangkan untuk membuat 327 aktivitas yang tidak mengimplementasikan apa-apa kecuali metode {@link android.app.Activity#onCreateOptionsMenu(Menu) 328 onCreateOptionsMenu()} dan {@link android.app.Activity#onOptionsItemSelected(MenuItem) 329 onOptionsItemSelected()}. Kemudian perluas kelas ini untuk setiap aktivitas yang harus menggunakan 330 menu opsi yang sama. Dengan begini, Anda bisa mengelola satu set kode untuk menangani tindakan menu 331 dan setiap kelas turunan mewarisi perilaku menu. 332 Jika ingin menambahkan item menu ke salah satu aktivitas turunan, 333 kesampingkan {@link android.app.Activity#onCreateOptionsMenu(Menu) 334 onCreateOptionsMenu()} dalam aktivitas itu. Panggil {@code super.onCreateOptionsMenu(menu)} agar 335 item menu asli dibuat, kemudian tambahkan item menu yang baru dengan {@link 336 android.view.Menu#add(int,int,int,int) menu.add()}. Anda juga bisa mengesampingkan 337 perilaku superkelas untuk setiap item menu.</p> 338 339 340 <h3 id="ChangingTheMenu">Mengubah item menu saat runtime</h3> 341 342 <p>Setelah sistem memanggil {@link android.app.Activity#onCreateOptionsMenu(Menu) 343 onCreateOptionsMenu()}, sistem akan mempertahankan instance {@link android.view.Menu} yang Anda tempatkan dan 344 tidak akan memanggil {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} 345 lagi kecuali menu diinvalidkan karena suatu alasan. Akan tetapi, Anda harus menggunakan {@link 346 android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} hanya untuk membuat 347 status menu awal dan tidak untuk membuat perubahan selama daur hidup aktivitas.</p> 348 349 <p>Jika Anda ingin mengubah menu opsi berdasarkan 350 kejadian yang terjadi selama daur hidup aktivitas, Anda bisa melakukannya dalam metode 351 {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}. Metode ini 352 meneruskan objek {@link android.view.Menu} sebagaimana adanya saat ini sehingga Anda bisa mengubahnya, 353 seperti menambah, menghapus, atau menonaktifkan item. (Fragmen juga menyediakan callback {@link 354 android.app.Fragment#onPrepareOptionsMenu onPrepareOptionsMenu()}.)</p> 355 356 <p>Pada Android 2.3.x dan yang lebih rendah, sistem akan memanggil {@link 357 android.app.Activity#onPrepareOptionsMenu(Menu) 358 onPrepareOptionsMenu()} setiap kali pengguna membuka menu opsi (menekan tombol <em>Menu</em> 359 ).</p> 360 361 <p>Pada Android 3.0 dan yang lebih tinggi, menu opsi dianggap sebagai selalu terbuka saat item menu 362 ditampilkan pada action-bar. Bila ada kejadian dan Anda ingin melakukan pembaruan menu, Anda harus 363 memanggil {@link android.app.Activity#invalidateOptionsMenu invalidateOptionsMenu()} untuk meminta 364 sistem memanggil {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}.</p> 365 366 <p class="note"><strong>Catatan:</strong> 367 Anda tidak boleh mengubah item dalam menu opsi berdasarkan {@link android.view.View} yang saat ini 368 difokus. Saat dalam mode sentuh (bila pengguna tidak sedang menggunakan trackball atau d-pad), tampilan 369 tidak bisa mengambil fokus, sehingga Anda tidak boleh menggunakan fokus sebagai dasar untuk mengubah 370 item dalam menu opsi. Jika Anda ingin menyediakan item menu yang peka konteks pada {@link 371 android.view.View}, gunakan <a href="#context-menu">Menu Konteks</a>.</p> 372 373 374 375 376 <h2 id="context-menu">Membuat Menu Kontekstual</h2> 377 378 <div class="figure" style="width:420px;margin-top:-1em"> 379 <img src="{@docRoot}images/ui/menu-context.png" alt="" /> 380 <p class="img-caption"><strong>Gambar 3.</strong> Cuplikan layar menu konteks mengambang (kiri) 381 dan action-bar kontekstual (kanan).</p> 382 </div> 383 384 <p>Menu kontekstual menawarkan tindakan yang memengaruhi item atau bingkai konteks tertentu dalam UI. Anda 385 bisa menyediakan menu konteks untuk setiap tampilan, tetapi menu ini paling sering digunakan untuk item pada {@link 386 android.widget.ListView}, {@link android.widget.GridView}, atau kumpulan tampilan lainnya yang bisa digunakan 387 pengguna untuk melakukan tindakan langsung pada setiap item.</p> 388 389 <p>Ada dua cara menyediakan tindakan kontekstual:</p> 390 <ul> 391 <li>Dalam <a href="#FloatingContextMenu">menu konteks mengambang</a>. Menu muncul sebagai 392 daftar item menu mengambang (serupa dengan dialog) bila pengguna mengklik lama (menekan dan 393 menahan) pada tampilan yang mendeklarasikan dukungan bagi menu konteks. Pengguna bisa melakukan 394 tindakan kontekstual pada satu item untuk setiap kalinya.</li> 395 396 <li>Dalam <a href="#CAB">mode tindakan kontekstual</a>. Mode ini adalah implementasi sistem 397 {@link android.view.ActionMode} yang menampilkan <em>action-bar kontekstual</em> di bagian atas 398 layar dengan item tindakan yang memengaruhi item(-item) yang dipilih. Bila mode ini aktif, pengguna 399 bisa melakukan tindakan pada beberapa item sekaligus (jika aplikasi Anda mengizinkannya).</li> 400 </ul> 401 402 <p class="note"><strong>Catatan:</strong> Mode tindakan kontekstual tersedia pada Android 3.0 (API 403 level 11) dan yang lebih tinggi dan merupakan teknik yang lebih disukai untuk menampilkan tindakan kontekstual bila 404 tersedia. Jika aplikasi Anda mendukung versi yang lebih rendah daripada 3.0, maka Anda harus mundur ke 405 menu konteks mengambang pada perangkat-perangkat itu.</p> 406 407 408 <h3 id="FloatingContextMenu">Membuat menu konteks mengambang</h3> 409 410 <p>Untuk menyediakan menu konteks mengambang:</p> 411 <ol> 412 <li>Daftarkan {@link android.view.View} ke menu konteks yang harus dikaitkan dengan 413 memanggil {@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()} dan teruskan 414 {@link android.view.View} ke menu itu. 415 <p>Jika aktivitas Anda menggunakan {@link android.widget.ListView} atau {@link android.widget.GridView} dan 416 Anda ingin setiap item untuk menyediakan menu konteks yang sama, daftarkan semua item ke menu konteks dengan 417 meneruskan {@link android.widget.ListView} atau {@link android.widget.GridView} ke {@link 418 android.app.Activity#registerForContextMenu(View) registerForContextMenu()}.</p> 419 </li> 420 421 <li>Implementasikan metode {@link 422 android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()} 423 dalam {@link android.app.Activity} atau {@link android.app.Fragment} Anda. 424 <p>Bila tampilan yang terdaftar menerima kejadian klik-lama, sistem akan memanggil metode {@link 425 android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()} 426 Anda. Inilah tempat Anda mendefinisikan item menu, biasanya dengan memekarkan sumber daya menu. Misalnya: 427 </p> 428 <pre> 429 @Override 430 public void onCreateContextMenu(ContextMenu menu, View v, 431 ContextMenuInfo menuInfo) { 432 super.onCreateContextMenu(menu, v, menuInfo); 433 MenuInflater inflater = getMenuInflater(); 434 inflater.inflate(R.menu.context_menu, menu); 435 } 436 </pre> 437 438 <p>{@link android.view.MenuInflater} memungkinkan Anda untuk memekarkan menu konteks <a href="{@docRoot}guide/topics/resources/menu-resource.html">sumber daya menu</a>. Parameter metode callback 439 menyertakan {@link android.view.View} 440 yang dipilih pengguna dan objek {@link android.view.ContextMenu.ContextMenuInfo} yang menyediakan 441 informasi tambahan tentang item yang dipilih. Jika aktivitas Anda memiliki beberapa tampilan yang masing-masingnya menyediakan 442 menu konteks berbeda, Anda bisa menggunakan parameter ini untuk menentukan menu konteks yang harus 443 dimekarkan.</p> 444 </li> 445 446 <li>Implementasikan {@link android.app.Activity#onContextItemSelected(MenuItem) 447 onContextItemSelected()}. 448 <p>Bila pengguna memilih item menu, sistem akan memanggil metode ini sehingga Anda bisa melakukan 449 tindakan yang sesuai. Misalnya:</p> 450 451 <pre> 452 @Override 453 public boolean onContextItemSelected(MenuItem item) { 454 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 455 switch (item.getItemId()) { 456 case R.id.edit: 457 editNote(info.id); 458 return true; 459 case R.id.delete: 460 deleteNote(info.id); 461 return true; 462 default: 463 return super.onContextItemSelected(item); 464 } 465 } 466 </pre> 467 468 <p>Metode {@link android.view.MenuItem#getItemId()} melakukan query ID untuk 469 item menu yang dipilih, yang harus Anda tetapkan ke setiap item menu dalam XML dengan menggunakan atribut {@code 470 android:id}, seperti yang ditampilkan di bagian tentang <a href="#xml">Mendefinisikan Menu dalam 471 XML</a>.</p> 472 473 <p>Bila Anda berhasil menangani sebuah item menu, kembalikan {@code true}. Jika tidak menangani item menu, 474 Anda harus meneruskan item menu ke implementasi superkelas. Jika aktivitas Anda menyertakan fragmen, 475 aktivitas akan menerima callback ini lebih dahulu. Dengan memanggil superkelas bila tidak ditangani, sistem 476 meneruskan kejadian ke metode callback di setiap fragmen, satu per satu (sesuai dengan urutan 477 penambahan fragmen) hingga {@code true} atau {@code false} dikembalikan. (Implementasi default 478 untuk {@link android.app.Activity} dan {@code android.app.Fragment} mengembalikan {@code 479 false}, sehingga Anda harus selalu memanggil superkelas bila tidak ditangani.)</p> 480 </li> 481 </ol> 482 483 484 <h3 id="CAB">Menggunakan mode tindakan kontekstual</h3> 485 486 <p>Mode tindakan kontekstual adalah implementasi sistem {@link android.view.ActionMode} yang 487 memfokuskan interaksi pengguna pada upaya melakukan tindakan kontekstual. Bila seorang 488 pengguna mengaktifkan mode ini dengan memilih item, <em>action-bar kontekstual</em> akan muncul di bagian atas 489 layar untuk menampilkan tindakan yang bisa dilakukan pengguna pada item yang dipilih saat ini. Selagi mode ini 490 diaktifkan, pengguna bisa memilih beberapa item (jika Anda mengizinkan), membatalkan pilihan item, dan melanjutkan 491 penelusuran dalam aktivitas (sebanyak yang ingin Anda izinkan). Mode tindakan dinonaktifkan 492 dan action-bar kontekstual menghilang bila pengguna membatalkan pilihan semua item, menekan tombol BACK, 493 atau memilih tindakan <em>Done</em> di sisi kiri action-bar.</p> 494 495 <p class="note"><strong>Catatan:</strong> Action-bar kontekstual tidak harus 496 terkait dengan <a href="{@docRoot}guide/topics/ui/actionbar.html">action-bar</a>. Action-bar ini beroperasi 497 secara independen, walaupun action-bar kontekstual secara visual mengambil alih 498 posisi action-bar.</p> 499 500 <p>Jika Anda mengembangkan aplikasi untuk Android 3.0 (API level 11) atau yang lebih tinggi, Anda 501 biasanya harus menggunakan mode tindakan kontekstual untuk menampilkan tindakan kontekstual, sebagai ganti <a href="#FloatingContextMenu">menu konteks mengambang</a>.</p> 502 503 <p>Untuk tampilan yang menyediakan tindakan kontekstual, Anda biasanya harus memanggil mode tindakan kontekstual 504 pada salah satu dari dua kejadian (atau keduanya):</p> 505 <ul> 506 <li>Pengguna mengklik-lama pada tampilan.</li> 507 <li>Pengguna memilih kotak cek atau komponen UI yang serupa dalam tampilan.</li> 508 </ul> 509 510 <p>Cara aplikasi memanggil mode tindakan kontekstual dan mendefinisikan perilaku setiap 511 tindakan bergantung pada desain Anda. Pada dasarnya ada dua desain:</p> 512 <ul> 513 <li>Untuk tindakan kontekstual pada tampilan individual dan tak didukung.</li> 514 <li>Untuk tindakan kontekstual batch pada grup item dalam {@link 515 android.widget.ListView} atau {@link android.widget.GridView} (memungkinkan pengguna memilih beberapa 516 item dan melakukan tindakan pada semua item itu).</li> 517 </ul> 518 519 <p>Bagian berikut ini menjelaskan penyiapan yang diperlukan untuk setiap skenario.</p> 520 521 522 <h4 id="CABforViews">Mengaktifkan mode tindakan kontekstual untuk tampilan individual</h4> 523 524 <p>Jika Anda ingin memanggil mode tindakan kontekstual hanya bila pengguna memilih 525 tampilan tertentu, Anda harus:</p> 526 <ol> 527 <li>Mengimplementasikan antarmuka {@link android.view.ActionMode.Callback}. Dalam metode callback-nya, Anda 528 bisa menetapkan tindakan untuk action-bar kontekstual, merespons kejadian klik pada item tindakan, dan 529 menangani kejadian daur hidup lainnya untuk mode tindakan itu.</li> 530 <li>Memanggil {@link android.app.Activity#startActionMode startActionMode()} bila Anda ingin menampilkan 531 action-bar (seperti saat pengguna mengklik-lama pada tampilan).</li> 532 </ol> 533 534 <p>Misalnya:</p> 535 536 <ol> 537 <li>Implementasikan antarmuka {@link android.view.ActionMode.Callback ActionMode.Callback}: 538 <pre> 539 private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { 540 541 // Called when the action mode is created; startActionMode() was called 542 @Override 543 public boolean onCreateActionMode(ActionMode mode, Menu menu) { 544 // Inflate a menu resource providing context menu items 545 MenuInflater inflater = mode.getMenuInflater(); 546 inflater.inflate(R.menu.context_menu, menu); 547 return true; 548 } 549 550 // Called each time the action mode is shown. Always called after onCreateActionMode, but 551 // may be called multiple times if the mode is invalidated. 552 @Override 553 public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 554 return false; // Return false if nothing is done 555 } 556 557 // Called when the user selects a contextual menu item 558 @Override 559 public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 560 switch (item.getItemId()) { 561 case R.id.menu_share: 562 shareCurrentItem(); 563 mode.finish(); // Action picked, so close the CAB 564 return true; 565 default: 566 return false; 567 } 568 } 569 570 // Called when the user exits the action mode 571 @Override 572 public void onDestroyActionMode(ActionMode mode) { 573 mActionMode = null; 574 } 575 }; 576 </pre> 577 578 <p>Perhatikan bahwa kejadian callback ini hampir persis sama dengan callback untuk <a href="#options-menu">menu opsi</a>, hanya saja setiap callback ini juga meneruskan objek {@link 579 android.view.ActionMode} yang terkait dengan kejadian. Anda bisa menggunakan API {@link 580 android.view.ActionMode} untuk membuat berbagai perubahan pada CAB, seperti merevisi judul dan 581 subjudul dengan {@link android.view.ActionMode#setTitle setTitle()} dan {@link 582 android.view.ActionMode#setSubtitle setSubtitle()} (berguna untuk menunjukkan jumlah item 583 yang dipilih).</p> 584 585 <p>Juga perhatikan bahwa contoh di atas mengatur variabel {@code mActionMode} ke nol bila 586 mode tindakan dimusnahkan. Dalam langkah berikutnya, Anda akan melihat cara variabel diinisialisasi dan kegunaan menyimpan 587 variabel anggota dalam aktivitas atau fragmen.</p> 588 </li> 589 590 <li>Panggil {@link android.app.Activity#startActionMode startActionMode()} untuk mengaktifkan 591 mode tindakan kontekstual bila sesuai, seperti saat merespons klik-lama pada {@link 592 android.view.View}:</p> 593 594 <pre> 595 someView.setOnLongClickListener(new View.OnLongClickListener() { 596 // Called when the user long-clicks on someView 597 public boolean onLongClick(View view) { 598 if (mActionMode != null) { 599 return false; 600 } 601 602 // Start the CAB using the ActionMode.Callback defined above 603 mActionMode = getActivity().startActionMode(mActionModeCallback); 604 view.setSelected(true); 605 return true; 606 } 607 }); 608 </pre> 609 610 <p>Bila Anda memanggil {@link android.app.Activity#startActionMode startActionMode()}, sistem akan mengembalikan 611 {@link android.view.ActionMode} yang dibuat. Dengan menyimpannya dalam variabel anggota, Anda bisa 612 membuat perubahan ke action-bar kontekstual sebagai respons terhadap kejadian lainnya. Dalam contoh di atas, 613 {@link android.view.ActionMode} digunakan untuk memastikan bahwa instance {@link android.view.ActionMode} 614 tidak dibuat kembali jika sudah aktif, dengan memeriksa apakah anggota bernilai nol sebelum memulai 615 mode tindakan.</p> 616 </li> 617 </ol> 618 619 620 621 <h4 id="CABforListView">Mengaktifkan tindakan kontekstual batch dalam ListView atau GridView</h4> 622 623 <p>Jika Anda memiliki sekumpulan item dalam {@link android.widget.ListView} atau {@link 624 android.widget.GridView} (atau ekstensi {@link android.widget.AbsListView} lainnya) dan ingin 625 mengizinkan pengguna melakukan tindakan batch, Anda harus:</p> 626 627 <ul> 628 <li>Mengimplementasikan antarmuka {@link android.widget.AbsListView.MultiChoiceModeListener} dan mengaturnya 629 untuk grup tampilan dengan {@link android.widget.AbsListView#setMultiChoiceModeListener 630 setMultiChoiceModeListener()}. Dalam metode callback listener, Anda bisa menetapkan tindakan 631 untuk action-bar kontekstual, merespons kejadian klik pada item tindakan, dan menangani callback lainnya 632 yang diwarisi dari antarmuka {@link android.view.ActionMode.Callback}.</li> 633 634 <li>Panggil {@link android.widget.AbsListView#setChoiceMode setChoiceMode()} dengan argumen {@link 635 android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL}.</li> 636 </ul> 637 638 <p>Misalnya:</p> 639 640 <pre> 641 ListView listView = getListView(); 642 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 643 listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { 644 645 @Override 646 public void onItemCheckedStateChanged(ActionMode mode, int position, 647 long id, boolean checked) { 648 // Here you can do something when items are selected/de-selected, 649 // such as update the title in the CAB 650 } 651 652 @Override 653 public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 654 // Respond to clicks on the actions in the CAB 655 switch (item.getItemId()) { 656 case R.id.menu_delete: 657 deleteSelectedItems(); 658 mode.finish(); // Action picked, so close the CAB 659 return true; 660 default: 661 return false; 662 } 663 } 664 665 @Override 666 public boolean onCreateActionMode(ActionMode mode, Menu menu) { 667 // Inflate the menu for the CAB 668 MenuInflater inflater = mode.getMenuInflater(); 669 inflater.inflate(R.menu.context, menu); 670 return true; 671 } 672 673 @Override 674 public void onDestroyActionMode(ActionMode mode) { 675 // Here you can make any necessary updates to the activity when 676 // the CAB is removed. By default, selected items are deselected/unchecked. 677 } 678 679 @Override 680 public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 681 // Here you can perform updates to the CAB due to 682 // an {@link android.view.ActionMode#invalidate} request 683 return false; 684 } 685 }); 686 </pre> 687 688 <p>Demikian saja. Kini bila pengguna memilih item dengan klik-lama, sistem akan memanggil metode {@link 689 android.widget.AbsListView.MultiChoiceModeListener#onCreateActionMode onCreateActionMode()} 690 dan menampilkan action-bar kontekstual bersama tindakan yang ditetapkan. Saat 691 action-bar kontekstual terlihat, pengguna bisa memilih item tambahan.</p> 692 693 <p>Dalam beberapa kasus di mana tindakan kontekstual menyediakan item tindakan umum, Anda mungkin 694 ingin menambahkan kotak cek atau elemen UI serupa yang memungkinkan pengguna memilih item, karena pengguna 695 mungkin tidak menemukan perilaku klik-lama. Bila pengguna memilih kotak cek itu, Anda 696 bisa memanggil mode tindakan kontekstual dengan mengatur item daftar yang bersangkutan ke 697 status diberi tanda cek dengan {@link android.widget.AbsListView#setItemChecked setItemChecked()}.</p> 698 699 700 701 702 <h2 id="PopupMenu">Membuat Menu Popup</h2> 703 704 <div class="figure" style="width:220px"> 705 <img src="{@docRoot}images/ui/popupmenu.png" alt="" /> 706 <p><strong>Gambar 4.</strong> Menu popup dalam aplikasi Gmail, dikaitkan pada 707 tombol kelebihan di sudut kanan atas.</p> 708 </div> 709 710 <p>{@link android.widget.PopupMenu} adalah menu modal yang dikaitkan pada {@link android.view.View}. 711 Menu ini muncul di bawah tampilan jangkar jika ada ruang, atau di atas tampilan jika tidak ada. Menu ini berguna untuk:</p> 712 <ul> 713 <li>Menyediakan menu bergaya kelebihan (overflow) untuk tindakan yang <em>berkaitan dengan</em> konten tertentu (seperti 714 header email Gmail, yang ditampilkan dalam gambar 4). 715 <p class="note"><strong>Catatan:</strong> Ini tidak sama dengan menu konteks, yang umumnya 716 untuk tindakan yang <em>memengaruhi</em> konten yang dipilih. Untuk tindakan yang memengaruhi 717 konten yang dipilih, gunakan <a href="#CAB">mode tindakan kontekstual</a> atau <a href="#FloatingContextMenu">menu konteks mengambang</a>.</p></li> 718 <li>Menyediakan bagian kedua dari kalimat perintah (seperti tombol bertanda "Tambah" 719 yang menghasilkan menu popup dengan berbagai opsi "Tambah").</li> 720 <li>Menyediakan daftar menurun yang serupa dengan {@link android.widget.Spinner} yang tidak mempertahankan 721 pilihan persisten.</li> 722 </ul> 723 724 725 <p class="note"><strong>Catatan:</strong> {@link android.widget.PopupMenu} tersedia dengan API 726 level 11 dan yang lebih tinggi.</p> 727 728 <p>Jika Anda <a href="#xml">mendefinisikan menu dalam XML</a>, berikut ini adalah cara Anda menampilkan menu popup:</p> 729 <ol> 730 <li>Buat instance {@link android.widget.PopupMenu} bersama konstruktornya, yang mengambil 731 aplikasi saat ini {@link android.content.Context} dan {@link android.view.View} yang akan menjadi tempat mengaitkan 732 menu.</li> 733 <li>Gunakan {@link android.view.MenuInflater} untuk memekarkan sumber daya menu Anda ke dalam objek {@link 734 android.view.Menu} yang dikembalikan oleh {@link 735 android.widget.PopupMenu#getMenu() PopupMenu.getMenu()}. Pada API level 14 ke atas, Anda bisa menggunakan 736 {@link android.widget.PopupMenu#inflate PopupMenu.inflate()} sebagai gantinya.</li> 737 <li>Panggil {@link android.widget.PopupMenu#show() PopupMenu.show()}.</li> 738 </ol> 739 740 <p>Misalnya, berikut ini adalah tombol dengan atribut {@link android.R.attr#onClick android:onClick} 741 yang menampilkan menu popup:</p> 742 743 <pre> 744 <ImageButton 745 android:layout_width="wrap_content" 746 android:layout_height="wrap_content" 747 android:src="@drawable/ic_overflow_holo_dark" 748 android:contentDescription="@string/descr_overflow_button" 749 android:onClick="showPopup" /> 750 </pre> 751 752 <p>Aktivitas nanti bisa menampilkan menu popup seperti ini:</p> 753 754 <pre> 755 public void showPopup(View v) { 756 PopupMenu popup = new PopupMenu(this, v); 757 MenuInflater inflater = popup.getMenuInflater(); 758 inflater.inflate(R.menu.actions, popup.getMenu()); 759 popup.show(); 760 } 761 </pre> 762 763 <p>Dalam API level 14 dan yang lebih tinggi, Anda bisa menggabungkan dua baris yang memekarkan menu dengan {@link 764 android.widget.PopupMenu#inflate PopupMenu.inflate()}.</p> 765 766 <p>Menu akan menghilang bila pengguna memilih item atau menyentuh di luar 767 area menu. Anda bisa mendengarkan kejadian menghilangkan dengan menggunakan {@link 768 android.widget.PopupMenu.OnDismissListener}.</p> 769 770 <h3 id="PopupEvents">Menangani kejadian klik</h3> 771 772 <p>Untuk melakukan suatu 773 tindakan bila pengguna memilih item menu, Anda harus mengimplementasikan antarmuka {@link 774 android.widget.PopupMenu.OnMenuItemClickListener} dan mendaftarkannya pada {@link 775 android.widget.PopupMenu} dengan memanggil {@link android.widget.PopupMenu#setOnMenuItemClickListener 776 setOnMenuItemclickListener()}. Bila pengguna memilih item, sistem akan memanggil callback {@link 777 android.widget.PopupMenu.OnMenuItemClickListener#onMenuItemClick onMenuItemClick()} dalam 778 antarmuka Anda.</p> 779 780 <p>Misalnya:</p> 781 782 <pre> 783 public void showMenu(View v) { 784 PopupMenu popup = new PopupMenu(this, v); 785 786 // This activity implements OnMenuItemClickListener 787 popup.setOnMenuItemClickListener(this); 788 popup.inflate(R.menu.actions); 789 popup.show(); 790 } 791 792 @Override 793 public boolean onMenuItemClick(MenuItem item) { 794 switch (item.getItemId()) { 795 case R.id.archive: 796 archive(item); 797 return true; 798 case R.id.delete: 799 delete(item); 800 return true; 801 default: 802 return false; 803 } 804 } 805 </pre> 806 807 808 <h2 id="groups">Membuat Grup Menu</h2> 809 810 <p>Grup menu adalah sekumpulan item menu yang sama-sama memiliki ciri (trait) tertentu. Dengan grup, Anda 811 bisa:</p> 812 <ul> 813 <li>Menampilkan atau menyembunyikan semua item dengan {@link android.view.Menu#setGroupVisible(int,boolean) 814 setGroupVisible()}</li> 815 <li>Mengaktifkan atau mennonaktifkan semua item dengan {@link android.view.Menu#setGroupEnabled(int,boolean) 816 setGroupEnabled()}</li> 817 <li>Menetapkan apakah semua item bisa diberi tanda cek dengan {@link 818 android.view.Menu#setGroupCheckable(int,boolean,boolean) setGroupCheckable()}</li> 819 </ul> 820 821 <p>Anda bisa membuat grup dengan menyarangkan elemen-elemen {@code <item>} dalam elemen {@code <group>} 822 dalam sumber daya menu atau dengan menetapkan ID grup dengan metode {@link 823 android.view.Menu#add(int,int,int,int) add()}.</p> 824 825 <p>Berikut ini adalah contoh sumber daya menu yang berisi sebuah grup:</p> 826 827 <pre> 828 <?xml version="1.0" encoding="utf-8"?> 829 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 830 <item android:id="@+id/menu_save" 831 android:icon="@drawable/menu_save" 832 android:title="@string/menu_save" /> 833 <!-- menu group --> 834 <group android:id="@+id/group_delete"> 835 <item android:id="@+id/menu_archive" 836 android:title="@string/menu_archive" /> 837 <item android:id="@+id/menu_delete" 838 android:title="@string/menu_delete" /> 839 </group> 840 </menu> 841 </pre> 842 843 <p>Item yang berada dalam grup akan muncul pada level yang sama dengan item pertama—ketiga item 844 dalam menu adalah bersaudara. Akan tetapi, Anda bisa memodifikasi ciri kedua 845 item dalam grup dengan mengacu ID grup dan menggunakan metode yang tercantum di atas. Sistem 846 juga tidak akan memisahkan item yang telah dikelompokkan. Misalnya, jika Anda mendeklarasikan {@code 847 android:showAsAction="ifRoom"} untuk tiap item, item tersebut akan muncul dalam 848 action-bar atau dalam kelebihan tindakan.</p> 849 850 851 <h3 id="checkable">Menggunakan item menu yang bisa diberi tanda cek</h3> 852 853 <div class="figure" style="width:200px"> 854 <img src="{@docRoot}images/radio_buttons.png" height="333" alt="" /> 855 <p class="img-caption"><strong>Gambar 5.</strong> Cuplikan layar submenu dengan 856 item yang bisa diberi tanda cek.</p> 857 </div> 858 859 <p>Menu bisa digunakan sebagai antarmuka untuk mengaktifkan dan menonaktifkan opsi, menggunakan kotak cek untuk 860 opsi mandiri, atau tombol radio untuk grup 861 opsi yang saling eksklusif. Gambar 5 menampilkan submenu dengan item yang bisa diberi tanda cek dengan 862 tombol radio.</p> 863 864 <p class="note"><strong>Catatan:</strong> Item menu dalam Icon Menu (dari menu opsi) tidak bisa 865 menampilkan kotak cek atau tombol radio. Jika Anda memilih untuk membuat item dalam Icon Menu yang bisa diberi tanda cek, 866 Anda harus menandai status diberi tanda cek secara manual dengan menukar ikon dan/atau teks 867 tiap kali statusnya berubah.</p> 868 869 <p>Anda bisa mendefinisikan perilaku yang bisa diberi tanda cek untuk tiap item menu dengan menggunakan atribut {@code 870 android:checkable} dalam elemen {@code <item>}, atau untuk seluruh grup dengan 871 atribut {@code android:checkableBehavior} dalam elemen {@code <group>}. Misalnya 872 , semua item dalam grup menu ini bisa diberi tanda cek dengan tombol radio:</p> 873 874 <pre> 875 <?xml version="1.0" encoding="utf-8"?> 876 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 877 <group android:checkableBehavior="single"> 878 <item android:id="@+id/red" 879 android:title="@string/red" /> 880 <item android:id="@+id/blue" 881 android:title="@string/blue" /> 882 </group> 883 </menu> 884 </pre> 885 886 <p>Atribut {@code android:checkableBehavior} menerima: 887 <dl> 888 <dt>{@code single}</dt> 889 <dd>Hanya satu item dari grup ini yang bisa diberi tanda cek (tombol radio)</dd> 890 <dt>{@code all}</dt> 891 <dd>Semua item bisa diberi tanda cek (kotak cek)</dd> 892 <dt>{@code none}</dt> 893 <dd>Tidak ada item yang bisa diberi tanda cek</dd> 894 </dl> 895 896 <p>Anda bisa menerapkan status diberi tanda cek default pada suatu item dengan menggunakan atribut {@code android:checked} dalam 897 elemen {@code <item>} dan mengubahnya dalam kode dengan metode {@link 898 android.view.MenuItem#setChecked(boolean) setChecked()}.</p> 899 900 <p>Bila item yang bisa diberi tanda cek dipilih, sistem akan memanggil metode callback setiap item yang dipilih 901 (seperti {@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}). Di sinilah 902 Anda harus mengatur status kotak cek itu, karena kotak cek atau tombol radio tidak 903 mengubah statusnya secara otomatis. Anda bisa melakukan query status saat ini suatu item (seperti sebelum 904 pengguna memilihnya) dengan {@link android.view.MenuItem#isChecked()} kemudian mengatur status diberi tanda cek dengan 905 {@link android.view.MenuItem#setChecked(boolean) setChecked()}. Misalnya:</p> 906 907 <pre> 908 @Override 909 public boolean onOptionsItemSelected(MenuItem item) { 910 switch (item.getItemId()) { 911 case R.id.vibrate: 912 case R.id.dont_vibrate: 913 if (item.isChecked()) item.setChecked(false); 914 else item.setChecked(true); 915 return true; 916 default: 917 return super.onOptionsItemSelected(item); 918 } 919 } 920 </pre> 921 922 <p>Jika Anda tidak mengatur status diberi tanda cek dengan cara ini, maka status item (kotak cek atau 923 tombol radio) yang terlihat tidak akan 924 berubah bila pengguna memilihnya. Bila Anda telah mengatur status, aktivitas akan menjaga status diberi tanda cek 925 suatu item sehingga bila nanti pengguna membuka menu, status diberi tanda cek yang Anda 926 atur akan terlihat.</p> 927 928 <p class="note"><strong>Catatan:</strong> 929 Item menu yang bisa diberi tanda cek dimaksudkan untuk digunakan hanya atas dasar per sesi dan tidak disimpan setelah 930 aplikasi dimusnahkan. Jika Anda memiliki pengaturan aplikasi yang ingin disimpan untuk pengguna, 931 Anda harus menyimpan data dengan menggunakan <a href="{@docRoot}guide/topics/data/data-storage.html#pref">Shared Preferences</a>.</p> 932 933 934 935 <h2 id="intents">Menambahkan Item Menu Berdasarkan Intent</h2> 936 937 <p>Kadang-kadang Anda ingin supaya item menu menjalankan aktivitas dengan menggunakan {@link android.content.Intent} 938 (baik aktivitas berada dalam aplikasi Anda maupun di aplikasi lain). Bila Anda mengetahui intent 939 yang ingin digunakan dan memiliki item menu tertentu yang harus memulai intent, Anda bisa mengeksekusi 940 intent dengan {@link android.app.Activity#startActivity(Intent) startActivity()} selama 941 metode callback bila-item-dipilih yang sesuai (seperti callback {@link 942 android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}).</p> 943 944 <p>Akan tetapi, jika Anda tidak yakin apakah perangkat pengguna 945 berisi aplikasi yang menangani intent, maka menambahkan item menu yang memanggilnya bisa mengakibatkan 946 item menu tidak berfungsi, karena intent tidak bisa diterjemahkan menjadi 947 aktivitas. Untuk mengatasi hal ini, Android memungkinkan Anda menambahkan item menu secara dinamis ke menu 948 bila Android menemukan aktivitas pada perangkat yang menangani intent Anda.</p> 949 950 <p>Untuk menambahkan item menu berdasarkan aktivitas tersedia yang menerima intent:</p> 951 <ol> 952 <li>Definisikan 953 intent dengan kategori {@link android.content.Intent#CATEGORY_ALTERNATIVE} dan/atau 954 {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE}, plus kebutuhan lainnya.</li> 955 <li>Panggil {@link 956 android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[]) 957 Menu.addIntentOptions()}. Android kemudian akan mencari setiap aplikasi yang bisa melakukan intent 958 dan menambahkannya ke menu Anda.</li> 959 </ol> 960 961 <p>Jika tidak ada aplikasi terinstal 962 yang memenuhi intent, maka tidak ada item menu yang ditambahkan.</p> 963 964 <p class="note"><strong>Catatan:</strong> 965 {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} digunakan untuk menangani 966 elemen yang saat ini dipilih pada layar. Jadi, metode hanya digunakan saat membuat Menu dalam {@link 967 android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo) 968 onCreateContextMenu()}.</p> 969 970 <p>Misalnya:</p> 971 972 <pre> 973 @Override 974 public boolean onCreateOptionsMenu(Menu menu){ 975 super.onCreateOptionsMenu(menu); 976 977 // Create an Intent that describes the requirements to fulfill, to be included 978 // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE. 979 Intent intent = new Intent(null, dataUri); 980 intent.addCategory(Intent.CATEGORY_ALTERNATIVE); 981 982 // Search and populate the menu with acceptable offering applications. 983 menu.addIntentOptions( 984 R.id.intent_group, // Menu group to which new items will be added 985 0, // Unique item ID (none) 986 0, // Order for the items (none) 987 this.getComponentName(), // The current activity name 988 null, // Specific items to place first (none) 989 intent, // Intent created above that describes our requirements 990 0, // Additional flags to control items (none) 991 null); // Array of MenuItems that correlate to specific items (none) 992 993 return true; 994 }</pre> 995 996 <p>Untuk setiap aktivitas yang diketahui menyediakan filter intent yang cocok dengan intent yang didefinisikan, item menu 997 akan ditambahkan, menggunakan nilai dalam filter intent <code>android:label</code> sebagai 998 judul item menu dan ikon aplikasi sebagai ikon item menu. Metode 999 {@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[]) 1000 addIntentOptions()} mengembalikan jumlah item menu yang ditambahkan.</p> 1001 1002 <p class="note"><strong>Catatan:</strong> Bila Anda memanggil {@link 1003 android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[]) 1004 addIntentOptions()}, metode ini akan mengesampingkan setiap dan semua item menu menurut grup menu yang ditetapkan dalam argumen 1005 pertama.</p> 1006 1007 1008 <h3 id="AllowingToAdd">Memungkinkan aktivitas Anda ditambahkan ke menu lain</h3> 1009 1010 <p>Anda juga bisa menawarkan layanan aktivitas Anda pada aplikasi lainnya, sehingga 1011 aplikasi Anda bisa disertakan dalam menu aplikasi lain (membalik peran yang dijelaskan di atas).</p> 1012 1013 <p>Agar bisa dimasukkan dalam menu aplikasi lain, Anda perlu mendefinisikan 1014 filter intent seperti biasa, tetapi pastikan menyertakan nilai-nilai {@link android.content.Intent#CATEGORY_ALTERNATIVE} 1015 dan/atau {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} untuk 1016 kategori filter intent. Misalnya:</p> 1017 <pre> 1018 <intent-filter label="@string/resize_image"> 1019 ... 1020 <category android:name="android.intent.category.ALTERNATIVE" /> 1021 <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> 1022 ... 1023 </intent-filter> 1024 </pre> 1025 1026 <p>Baca selengkapnya tentang penulisan filter intent dalam dokumen 1027 <a href="/guide/components/intents-filters.html">Intent dan Filter Intent</a>.</p> 1028 1029 <p>Untuk contoh aplikasi yang menggunakan teknik ini, lihat contoh kode 1030 <a href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">Note 1031 Pad</a>.</p> 1032