Home | History | Annotate | Download | only in ui
      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&mdash;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>&lt;menu></code></dt>
    131     <dd>Mendefinisikan {@link android.view.Menu}, yang merupakan sebuah kontainer untuk item menu. Elemen 
    132 <code>&lt;menu></code> harus menjadi simpul akar untuk file dan bisa menampung salah satu atau beberapa dari elemen
    133 <code>&lt;item></code> dan <code>&lt;group></code>.</dd>
    134 
    135   <dt><code>&lt;item></code></dt>
    136     <dd>Membuat {@link android.view.MenuItem}, yang mewakili satu item menu. Elemen ini
    137 bisa berisi elemen <code>&lt;menu></code> tersarang guna untuk membuat submenu.</dd>
    138     
    139   <dt><code>&lt;group></code></dt>
    140     <dd>Kontainer opsional tak terlihat untuk elemen-elemen {@code &lt;item&gt;}. 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 &lt;?xml version="1.0" encoding="utf-8"?&gt;
    149 &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    150     &lt;item android:id="@+id/new_game"
    151           android:icon="@drawable/ic_new_game"
    152           android:title="@string/new_game"
    153           android:showAsAction="ifRoom"/&gt;
    154     &lt;item android:id="@+id/help"
    155           android:icon="@drawable/ic_help"
    156           android:title="@string/help" /&gt;
    157 &lt;/menu&gt;
    158 </pre>
    159 
    160 <p>Elemen <code>&lt;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 &lt;menu&gt;}
    179 sebagai anak {@code &lt;item&gt;}. 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 &lt;?xml version="1.0" encoding="utf-8"?&gt;
    185 &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    186     &lt;item android:id="@+id/file"
    187           android:title="@string/file" &gt;
    188         &lt;!-- "file" submenu --&gt;
    189         &lt;menu&gt;
    190             &lt;item android:id="@+id/create_new"
    191                   android:title="@string/create_new" /&gt;
    192             &lt;item android:id="@+id/open"
    193                   android:title="@string/open" /&gt;
    194         &lt;/menu&gt;
    195     &lt;/item&gt;
    196 &lt;/menu&gt;
    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 &lt;item&gt;} 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 &lt;item&gt;} 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 &#64;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 &#64;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}&mdash;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 &#64;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 &#64;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     &#64;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     &#64;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     &#64;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     &#64;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     &#64;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     &#64;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     &#64;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     &#64;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     &#64;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 &lt;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 &#64;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 &lt;item&gt;} dalam elemen {@code &lt;group&gt;}
    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 &lt;?xml version="1.0" encoding="utf-8"?&gt;
    829 &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    830     &lt;item android:id="@+id/menu_save"
    831           android:icon="@drawable/menu_save"
    832           android:title="@string/menu_save" /&gt;
    833     &lt;!-- menu group --&gt;
    834     &lt;group android:id="@+id/group_delete"&gt;
    835         &lt;item android:id="@+id/menu_archive"
    836               android:title="@string/menu_archive" /&gt;
    837         &lt;item android:id="@+id/menu_delete"
    838               android:title="@string/menu_delete" /&gt;
    839     &lt;/group&gt;
    840 &lt;/menu&gt;
    841 </pre>
    842 
    843 <p>Item yang berada dalam grup akan muncul pada level yang sama dengan item pertama&mdash;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 &lt;item&gt;}, atau untuk seluruh grup dengan
    871 atribut {@code android:checkableBehavior} dalam elemen {@code &lt;group&gt;}. Misalnya
    872 , semua item dalam grup menu ini bisa diberi tanda cek dengan tombol radio:</p>
    873 
    874 <pre>
    875 &lt;?xml version="1.0" encoding="utf-8"?&gt;
    876 &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    877     &lt;group android:checkableBehavior="single"&gt;
    878         &lt;item android:id="@+id/red"
    879               android:title="@string/red" /&gt;
    880         &lt;item android:id="@+id/blue"
    881               android:title="@string/blue" /&gt;
    882     &lt;/group&gt;
    883 &lt;/menu&gt;
    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 &lt;item&gt;} 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 &#64;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 &#64;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 &lt;intent-filter label="&#64;string/resize_image">
   1019     ...
   1020     &lt;category android:name="android.intent.category.ALTERNATIVE" />
   1021     &lt;category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
   1022     ...
   1023 &lt;/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