Home | History | Annotate | Download | only in ui
      1 page.title=Dialog
      2 page.tags=alertdialog,dialogfragment
      3 
      4 @jd:body
      5 
      6 
      7 
      8 <div id="qv-wrapper">
      9   <div id="qv">
     10     <h2>Dalam dokumen ini</h2>
     11 <ol>
     12   <li><a href="#DialogFragment">Membuat Fragmen Dialog</a></li>
     13   <li><a href="#AlertDialog">Membuat Dialog Peringatan</a>
     14     <ol>
     15       <li><a href="#AddingButtons">Menambahkan tombol</a></li>
     16       <li><a href="#AddingAList">Menambahkan daftar</a></li>
     17       <li><a href="#CustomLayout">Membuat Layout Custom</a></li>
     18     </ol>
     19   </li>
     20   <li><a href="#PassingEvents">Meneruskan Kejadian Kembali ke Host Dialog</a></li>
     21   <li><a href="#ShowingADialog">Menampilkan Dialog</a></li>
     22   <li><a href="#FullscreenDialog">Menampilkan Dialog sebagai Layar Penuh atau Fragmen Tertanam</a>
     23     <ol>
     24       <li><a href="#ActivityAsDialog">Menampilkan aktivitas sebagai dialog pada layar besar</a></li>
     25     </ol>
     26   </li>
     27   <li><a href="#DismissingADialog">Menutup Dialog</a></li>
     28 </ol>
     29 
     30     <h2>Kelas-kelas utama</h2>
     31     <ol>
     32       <li>{@link android.app.DialogFragment}</li>
     33       <li>{@link android.app.AlertDialog}</li>
     34     </ol>
     35 
     36     <h2>Lihat juga</h2>
     37     <ol>
     38       <li><a href="{@docRoot}design/building-blocks/dialogs.html">Panduan desain dialog</a></li>
     39       <li><a href="{@docRoot}guide/topics/ui/controls/pickers.html">Picker</a> (dialog Tanggal/Waktu)</li>
     40     </ol>
     41   </div>
     42 </div>
     43 
     44 <p>Dialog adalah jendela kecil yang meminta pengguna untuk
     45 membuat keputusan atau memasukkan informasi tambahan. Dialog tidak mengisi layar dan
     46 biasanya digunakan untuk kejadian modal yang mengharuskan pengguna untuk melakukan tindakan sebelum bisa melanjutkan.</p>
     47 
     48 <div class="note design">
     49 <p><strong>Desain Dialog</strong></p>
     50   <p>Untuk informasi tentang cara mendesain dialog, termasuk saran
     51   untuk bahasa, bacalah panduan Desain <a href="{@docRoot}design/building-blocks/dialogs.html">dialog</a>.</p>
     52 </div>
     53 
     54 <img src="{@docRoot}images/ui/dialogs.png" />
     55 
     56 <p>Kelas {@link android.app.Dialog} adalah kelas basis untuk dialog, namun Anda
     57 harus menghindari pembuatan instance {@link android.app.Dialog} secara langsung.
     58 Sebagai gantinya, gunakan salah satu subkelas berikut:</p>
     59 <dl>
     60   <dt>{@link android.app.AlertDialog}</dt>
     61   <dd>Dialog yang bisa menampilkan judul, hingga tiga tombol, daftar
     62     item yang dapat dipilih, atau layout custom.</dd>
     63   <dt>{@link android.app.DatePickerDialog} atau {@link android.app.TimePickerDialog}</dt>
     64   <dd>Dialog berisi UI yang sudah didefinisikan dan memungkinkan pengguna memilih tanggal atau waktu.</dd>
     65 </dl>
     66 
     67 <div class="sidebox">
     68 <h2>Hindari ProgressDialog</h2>
     69 <p>Android menyertakan kelas dialog lain yang disebut
     70 {@link android.app.ProgressDialog} yang menampilkan dialog berisi progress-bar. Akan tetapi, jika Anda
     71 perlu menunjukkan kemajuan pemuatan ataupun kemajuan yang tidak pasti, maka Anda harus mengikuti
     72 panduan desain untuk <a href="{@docRoot}design/building-blocks/progress.html">Kemajuan &amp;
     73 Aktivitas</a> dan menggunakan {@link android.widget.ProgressBar} dalam layout Anda.</p>
     74 </div>
     75 
     76 <p>Kelas-kelas ini mendefinisikan gaya dan struktur dialog Anda, namun Anda harus
     77 menggunakan {@link android.support.v4.app.DialogFragment} sebagai kontainer dialog Anda.
     78 Kelas {@link android.support.v4.app.DialogFragment} menyediakan semua kontrol yang Anda
     79 perlukan untuk membuat dialog dan mengelola penampilannya, sebagai ganti memanggil metode
     80 pada objek {@link android.app.Dialog}.</p>
     81 
     82 <p>Menggunakan {@link android.support.v4.app.DialogFragment} untuk mengelola dialog
     83 akan memastikan bahwa kelas itu menangani kejadian daur hidup
     84 dengan benar seperti ketika pengguna menekan tombol <em>Back</em> atau memutar layar. Kelas {@link
     85 android.support.v4.app.DialogFragment} juga memungkinkan Anda menggunakan ulang dialog UI sebagai
     86 komponen yang bisa ditanamkan dalam UI yang lebih besar, persis seperti {@link
     87 android.support.v4.app.Fragment} tradisional (seperti saat Anda ingin dialog UI muncul berbeda
     88 pada layar besar dan kecil).</p>
     89 
     90 <p>Bagian-bagian berikutnya dalam panduan ini akan menjelaskan cara menggunakan {@link
     91 android.support.v4.app.DialogFragment} yang dikombinasikan dengan objek {@link android.app.AlertDialog}
     92 . Jika Anda ingin membuat picker tanggal atau waktu, Anda harus membaca panduan
     93 <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Picker</a>.</p>
     94 
     95 <p class="note"><strong>Catatan:</strong>
     96 Karena kelas {@link android.app.DialogFragment} mulanya ditambahkan pada
     97 Android 3.0 (API level 11), dokumen ini menjelaskan cara menggunakan kelas {@link
     98 android.support.v4.app.DialogFragment} yang disediakan bersama <a href="{@docRoot}tools/support-library/index.html">Pustaka Dukungan</a>. Dengan menambahkan pustaka ini
     99 ke aplikasi, Anda bisa menggunakan {@link android.support.v4.app.DialogFragment} dan berbagai
    100 API lain pada perangkat yang menjalankan Android 1.6 atau yang lebih tinggi. Jika versi minimum yang didukung aplikasi Anda
    101 adalah API level 11 atau yang lebih tinggi, maka Anda bisa menggunakan versi kerangka kerja {@link
    102 android.app.DialogFragment}, namun ketahuilah bahwa tautan dalam dokumen ini adalah untuk API
    103 pustaka dukungan. Saat menggunakan pustaka dukungan,
    104 pastikan Anda mengimpor kelas <code>android.support.v4.app.DialogFragment</code>
    105 dan <em>bukan</em> <code>android.app.DialogFragment</code>.</p>
    106 
    107 
    108 <h2 id="DialogFragment">Membuat Fragmen Dialog</h2>
    109 
    110 <p>Anda bisa menghasilkan beragam rancangan dialog&mdash;termasuk
    111 layout custom dan desain yang dijelaskan dalam panduan desain <a href="{@docRoot}design/building-blocks/dialogs.html">Dialog</a>
    112 &mdash;dengan memperluas
    113 {@link android.support.v4.app.DialogFragment} dan membuat {@link android.app.AlertDialog}
    114 dalam metode callback {@link android.support.v4.app.DialogFragment#onCreateDialog
    115 onCreateDialog()}.</p>
    116 
    117 <p>Misalnya, berikut ini sebuah {@link android.app.AlertDialog} dasar yang dikelola dalam
    118 {@link android.support.v4.app.DialogFragment}:</p>
    119 
    120 <pre>
    121 public class FireMissilesDialogFragment extends DialogFragment {
    122     &#64;Override
    123     public Dialog onCreateDialog(Bundle savedInstanceState) {
    124         // Use the Builder class for convenient dialog construction
    125         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    126         builder.setMessage(R.string.dialog_fire_missiles)
    127                .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
    128                    public void onClick(DialogInterface dialog, int id) {
    129                        // FIRE ZE MISSILES!
    130                    }
    131                })
    132                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    133                    public void onClick(DialogInterface dialog, int id) {
    134                        // User cancelled the dialog
    135                    }
    136                });
    137         // Create the AlertDialog object and return it
    138         return builder.create();
    139     }
    140 }
    141 </pre>
    142 
    143 <div class="figure" style="width:290px;margin:0 0 0 20px">
    144 <img src="{@docRoot}images/ui/dialog_buttons.png" alt="" />
    145 <p class="img-caption"><strong>Gambar 1.</strong>
    146 Dialog dengan satu pesan dan dua tombol tindakan.</p>
    147 </div>
    148 
    149 <p>Sekarang, bila Anda membuat instance kelas ini dan memanggil {@link
    150 android.support.v4.app.DialogFragment#show show()} pada objek itu, dialog akan muncul seperti
    151 yang ditampilkan dalam gambar 1.</p>
    152 
    153 <p>Bagian berikutnya menjelaskan lebih jauh tentang penggunaan API {@link android.app.AlertDialog.Builder}
    154 untuk membuat dialog.</p>
    155 
    156 <p>Bergantung pada seberapa rumit dialog tersebut, Anda bisa menerapkan berbagai metode callback lain
    157 dalam {@link android.support.v4.app.DialogFragment}, termasuk semua
    158 <a href="{@docRoot}guide/components/fragments.html#Lifecycle">metode daur hidup fragmen</a> dasar.
    159 
    160 
    161 
    162 
    163 
    164 <h2 id="AlertDialog">Membuat Dialog Peringatan</h2>
    165 
    166 
    167 <p>Kelas {@link android.app.AlertDialog} memungkinkan Anda membuat berbagai desain dialog dan
    168 seringkali satu-satunya kelas dialog yang akan Anda perlukan.
    169 Seperti yang ditampilkan dalam gambar 2, ada tiga area pada dialog peringatan:</p>
    170 
    171 <div class="figure" style="width:311px;margin-top:0">
    172 <img src="{@docRoot}images/ui/dialogs_regions.png" alt="" style="margin-bottom:0" />
    173 <p class="img-caption"><strong>Gambar 2.</strong> Layout dialog.</p>
    174 </div>
    175 
    176 <ol>
    177 <li><b>Judul</b>
    178   <p>Area ini opsional dan hanya boleh digunakan bila area konten
    179   ditempati oleh pesan terperinci, daftar, atau layout custom. Jika Anda perlu menyatakan
    180   pesan atau pertanyaan sederhana (seperti dialog dalam gambar 1), Anda tidak memerlukan judul.</li>
    181 <li><b>Area konten</b>
    182   <p>Area ini bisa menampilkan pesan, daftar, atau layout custom lainnya.</p></li>
    183 <li><b>Tombol tindakan</b>
    184   <p>Tidak boleh ada lebih dari tiga tombol tindakan dalam sebuah dialog.</p></li>
    185 </ol>
    186 
    187 <p>Kelas {@link android.app.AlertDialog.Builder}
    188  menyediakan API yang memungkinkan Anda membuat {@link android.app.AlertDialog}
    189 dengan jenis konten ini, termasuk layout custom.</p>
    190 
    191 <p>Untuk membuat {@link android.app.AlertDialog}:</p>
    192 
    193 <pre>
    194 <b>// 1. Instantiate an {@link android.app.AlertDialog.Builder} with its constructor</b>
    195 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    196 
    197 <b>// 2. Chain together various setter methods to set the dialog characteristics</b>
    198 builder.setMessage(R.string.dialog_message)
    199        .setTitle(R.string.dialog_title);
    200 
    201 <b>// 3. Get the {@link android.app.AlertDialog} from {@link android.app.AlertDialog.Builder#create()}</b>
    202 AlertDialog dialog = builder.create();
    203 </pre>
    204 
    205 <p>Topik-topik selanjutnya menampilkan cara mendefinisikan berbagai atribut dialog dengan menggunakan
    206 kelas {@link android.app.AlertDialog.Builder}.</p>
    207 
    208 
    209 
    210 
    211 <h3 id="AddingButtons">Menambahkan tombol</h3>
    212 
    213 <p>Untuk menambahkan tombol tindakan seperti dalam gambar 2,
    214 panggil metode {@link android.app.AlertDialog.Builder#setPositiveButton setPositiveButton()} dan
    215 {@link android.app.AlertDialog.Builder#setNegativeButton setNegativeButton()}:</p>
    216 
    217 <pre style="clear:right">
    218 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    219 // Add the buttons
    220 builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    221            public void onClick(DialogInterface dialog, int id) {
    222                // User clicked OK button
    223            }
    224        });
    225 builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    226            public void onClick(DialogInterface dialog, int id) {
    227                // User cancelled the dialog
    228            }
    229        });
    230 // Set other dialog properties
    231 ...
    232 
    233 // Create the AlertDialog
    234 AlertDialog dialog = builder.create();
    235 </pre>
    236 
    237 <p>Metode <code>set...Button()</code> mengharuskan adanya judul bagi tombol (disediakan
    238 oleh suatu <a href="{@docRoot}guide/topics/resources/string-resource.html">sumber daya string</a>) dan
    239 {@link android.content.DialogInterface.OnClickListener} yang mendefinisikan tindakan yang diambil
    240 bila pengguna menekan tombol.</p>
    241 
    242 <p>Ada tiga macam tombol tindakan yang Anda bisa tambahkan:</p>
    243 <dl>
    244   <dt>Positif</dt>
    245   <dd>Anda harus menggunakan tipe ini untuk menerima dan melanjutkan tindakan (tindakan "OK").</dd>
    246   <dt>Negatif</dt>
    247   <dd>Anda harus menggunakan tipe ini untuk membatalkan tindakan.</dd>
    248   <dt>Netral</dt>
    249   <dd>Anda harus menggunakan tipe ini bila pengguna mungkin tidak ingin melanjutkan tindakan,
    250   namun tidak ingin membatalkan. Tipe ini muncul antara tombol positif dan
    251 tombol negatif. Misalnya, tindakan bisa berupa "Ingatkan saya nanti".</dd>
    252 </dl>
    253 
    254 <p>Anda hanya bisa menambahkan salah satu tipe tombol ke {@link
    255 android.app.AlertDialog}. Artinya, Anda tidak bisa memiliki lebih dari satu tombol "positif".</p>
    256 
    257 
    258 
    259 <div class="figure" style="width:290px;margin:0 0 0 40px">
    260 <img src="{@docRoot}images/ui/dialog_list.png" alt="" />
    261 <p class="img-caption"><strong>Gambar 3.</strong>
    262 Dialog dengan satu judul dan daftar.</p>
    263 </div>
    264 
    265 <h3 id="AddingAList">Menambahkan daftar</h3>
    266 
    267 <p>Ada tiga macam daftar yang tersedia pada API {@link android.app.AlertDialog}:</p>
    268 <ul>
    269 <li>Daftar pilihan tunggal biasa</li>
    270 <li>Daftar pilihan tunggal persisten (tombol radio)</li>
    271 <li>Daftar pilihan ganda persisten (kotak cek)</li>
    272 </ul>
    273 
    274 <p>Untuk membuat daftar pilihan tunggal seperti dalam gambar 3,
    275 gunakan metode {@link android.app.AlertDialog.Builder#setItems setItems()}:</p>
    276 
    277 <pre style="clear:right">
    278 &#64;Override
    279 public Dialog onCreateDialog(Bundle savedInstanceState) {
    280     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    281     builder.setTitle(R.string.pick_color)
    282            .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
    283                public void onClick(DialogInterface dialog, int which) {
    284                // The 'which' argument contains the index position
    285                // of the selected item
    286            }
    287     });
    288     return builder.create();
    289 }
    290 </pre>
    291 
    292 <p>Karena daftar muncul dalam area konten dialog,
    293 dialog tidak bisa menampilkan pesan dan daftar sekaligus dan Anda harus menetapkan judul untuk
    294 dialog dengan {@link android.app.AlertDialog.Builder#setTitle setTitle()}.
    295 Untuk menentukan item daftar, panggil {@link
    296 android.app.AlertDialog.Builder#setItems setItems()}, dengan meneruskan larik.
    297 Atau, Anda bisa menetapkan daftar menggunakan {@link
    298 android.app.AlertDialog.Builder#setAdapter setAdapter()}. Hal ini memungkinkan Anda mendukung daftar
    299 dengan data dinamis (seperti dari database) dengan menggunakan {@link android.widget.ListAdapter}.</p>
    300 
    301 <p>Jika Anda memilih untuk mendukung daftar dengan {@link android.widget.ListAdapter},
    302 selalu gunakan sebuah {@link android.support.v4.content.Loader} agar konten dimuat
    303 secara asinkron. Hal ini dijelaskan lebih jauh dalam panduan
    304 <a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">Membuat Layout
    305 dengan Adaptor</a> dan <a href="{@docRoot}guide/components/loaders.html">Loader</a>
    306 .</p>
    307 
    308 <p class="note"><strong>Catatan:</strong> Secara default, menyentuh sebuah item daftar akan menutup dialog,
    309 kecuali Anda menggunakan salah satu daftar pilihan persisten berikut ini.</p>
    310 
    311 <div class="figure" style="width:290px;margin:-30px 0 0 40px">
    312 <img src="{@docRoot}images/ui/dialog_checkboxes.png" />
    313 <p class="img-caption"><strong>Gambar 4.</strong>
    314 Daftar item pilihan ganda.</p>
    315 </div>
    316 
    317 
    318 <h4 id="Checkboxes">Menambahkan daftar pilihan ganda atau pilihan tunggal persisten</h4>
    319 
    320 <p>Untuk menambahkan daftar item pilihan ganda (kotak cek) atau
    321 item pilihan tunggal (tombol radio), gunakan masing-masing metode
    322 {@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String,
    323 DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()}, atau
    324 {@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener)
    325 setSingleChoiceItems()}.</p>
    326 
    327 <p>Misalnya, berikut ini cara membuat daftar pilihan ganda seperti
    328 yang ditampilkan dalam gambar 4 yang menyimpan item
    329 yang dipilih dalam {@link java.util.ArrayList}:</p>
    330 
    331 <pre style="clear:right">
    332 &#64;Override
    333 public Dialog onCreateDialog(Bundle savedInstanceState) {
    334     mSelectedItems = new ArrayList();  // Where we track the selected items
    335     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    336     // Set the dialog title
    337     builder.setTitle(R.string.pick_toppings)
    338     // Specify the list array, the items to be selected by default (null for none),
    339     // and the listener through which to receive callbacks when items are selected
    340            .setMultiChoiceItems(R.array.toppings, null,
    341                       new DialogInterface.OnMultiChoiceClickListener() {
    342                &#64;Override
    343                public void onClick(DialogInterface dialog, int which,
    344                        boolean isChecked) {
    345                    if (isChecked) {
    346                        // If the user checked the item, add it to the selected items
    347                        mSelectedItems.add(which);
    348                    } else if (mSelectedItems.contains(which)) {
    349                        // Else, if the item is already in the array, remove it
    350                        mSelectedItems.remove(Integer.valueOf(which));
    351                    }
    352                }
    353            })
    354     // Set the action buttons
    355            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    356                &#64;Override
    357                public void onClick(DialogInterface dialog, int id) {
    358                    // User clicked OK, so save the mSelectedItems results somewhere
    359                    // or return them to the component that opened the dialog
    360                    ...
    361                }
    362            })
    363            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    364                &#64;Override
    365                public void onClick(DialogInterface dialog, int id) {
    366                    ...
    367                }
    368            });
    369 
    370     return builder.create();
    371 }
    372 </pre>
    373 
    374 <p>Walaupun daftar tradisional maupun daftar dengan tombol radio
    375 menyediakan tindakan "pilihan tunggal", Anda harus menggunakan {@link
    376 android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener)
    377 setSingleChoiceItems()} jika ingin mempertahankan pilihan pengguna.
    378 Yakni, jika nanti membuka dialog lagi untuk menunjukkan pilihan pengguna,
    379 maka Anda perlu membuat daftar dengan tombol radio.</p>
    380 
    381 
    382 
    383 
    384 
    385 <h3 id="CustomLayout">Membuat Layout Custom</h3>
    386 
    387 <div class="figure" style="width:290px;margin:-30px 0 0 40px">
    388 <img src="{@docRoot}images/ui/dialog_custom.png" alt="" />
    389 <p class="img-caption"><strong>Gambar 5.</strong> Layout dialog custom.</p>
    390 </div>
    391 
    392 <p>Jika Anda menginginkan layout custom dalam dialog, buatlah layout dan tambahkan ke
    393 {@link android.app.AlertDialog} dengan memanggil {@link
    394 android.app.AlertDialog.Builder#setView setView()} pada objek {@link
    395 android.app.AlertDialog.Builder} Anda.</p>
    396 
    397 <p>Secara default, layout custom akan mengisi jendela dialog, namun Anda masih bisa
    398 menggunakan metode {@link android.app.AlertDialog.Builder} untuk menambahkan tombol dan judul.</p>
    399 
    400 <p>Misalnya, berikut ini adalah file layout untuk dialog dalam Gambar 5:</p>
    401 
    402 <p style="clear:right" class="code-caption">res/layout/dialog_signin.xml</p>
    403 <pre>
    404 &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    405     android:orientation="vertical"
    406     android:layout_width="wrap_content"
    407     android:layout_height="wrap_content">
    408     &lt;ImageView
    409         android:src="@drawable/header_logo"
    410         android:layout_width="match_parent"
    411         android:layout_height="64dp"
    412         android:scaleType="center"
    413         android:background="#FFFFBB33"
    414         android:contentDescription="@string/app_name" />
    415     &lt;EditText
    416         android:id="@+id/username"
    417         android:inputType="textEmailAddress"
    418         android:layout_width="match_parent"
    419         android:layout_height="wrap_content"
    420         android:layout_marginTop="16dp"
    421         android:layout_marginLeft="4dp"
    422         android:layout_marginRight="4dp"
    423         android:layout_marginBottom="4dp"
    424         android:hint="@string/username" />
    425     &lt;EditText
    426         android:id="@+id/password"
    427         android:inputType="textPassword"
    428         android:layout_width="match_parent"
    429         android:layout_height="wrap_content"
    430         android:layout_marginTop="4dp"
    431         android:layout_marginLeft="4dp"
    432         android:layout_marginRight="4dp"
    433         android:layout_marginBottom="16dp"
    434         android:fontFamily="sans-serif"
    435         android:hint="@string/password"/>
    436 &lt;/LinearLayout>
    437 </pre>
    438 
    439 <p class="note"><strong>Tip:</strong> Secara default, bila Anda telah mengatur sebuah elemen {@link android.widget.EditText}
    440 agar menggunakan tipe input {@code "textPassword"}, keluarga font akan diatur ke spasi tunggal, sehingga
    441 Anda harus mengubah keluarga font ke {@code "sans-serif"} sehingga kedua bidang teks menggunakan
    442 gaya font yang cocok.</p>
    443 
    444 <p>Untuk memekarkan layout dalam {@link android.support.v4.app.DialogFragment} Anda,
    445 ambillah {@link android.view.LayoutInflater} dengan
    446 {@link android.app.Activity#getLayoutInflater()} dan panggil
    447 {@link android.view.LayoutInflater#inflate inflate()}, dengan parameter pertama
    448 adalah ID sumber daya layout dan parameter kedua adalah tampilan induk untuk layout.
    449 Selanjutnya Anda bisa memanggil {@link android.app.AlertDialog#setView setView()}
    450 untuk menempatkan layout dalam dialog.</p>
    451 
    452 <pre>
    453 &#64;Override
    454 public Dialog onCreateDialog(Bundle savedInstanceState) {
    455     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    456     // Get the layout inflater
    457     LayoutInflater inflater = getActivity().getLayoutInflater();
    458 
    459     // Inflate and set the layout for the dialog
    460     // Pass null as the parent view because its going in the dialog layout
    461     builder.setView(inflater.inflate(R.layout.dialog_signin, null))
    462     // Add action buttons
    463            .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
    464                &#64;Override
    465                public void onClick(DialogInterface dialog, int id) {
    466                    // sign in the user ...
    467                }
    468            })
    469            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    470                public void onClick(DialogInterface dialog, int id) {
    471                    LoginDialogFragment.this.getDialog().cancel();
    472                }
    473            });
    474     return builder.create();
    475 }
    476 </pre>
    477 
    478 <div class="note">
    479 <p><strong>Tip:</strong> Jika Anda menginginkan dialog custom,
    480 Anda bisa menampilkan {@link android.app.Activity} sebagai dialog
    481 daripada menggunakan API {@link android.app.Dialog}. Cukup buat satu aktivitas dan mengatur temanya ke
    482 {@link android.R.style#Theme_Holo_Dialog Theme.Holo.Dialog}
    483 di elemen manifes <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
    484 &lt;activity&gt;}</a>:</p>
    485 
    486 <pre>
    487 &lt;activity android:theme="&#64;android:style/Theme.Holo.Dialog" >
    488 </pre>
    489 <p>Demikian saja. Aktivitas sekarang ditampilkan dalam jendela dialog, sebagai ganti layar penuh.</p>
    490 </div>
    491 
    492 
    493 
    494 <h2 id="PassingEvents">Meneruskan Kejadian Kembali ke Host Dialog</h2>
    495 
    496 <p>Bila pengguna menyentuh salah satu tombol tindakan dialog atau memilih satu item dari daftarnya,
    497 {@link android.support.v4.app.DialogFragment} Anda bisa melakukan sendiri tindakan yang diperlukan
    498 , namun sering kali Anda perlu mengirim kejadian itu ke aktivitas atau fragmen yang
    499 membuka dialog. Caranya, definisikan antarmuka dengan sebuah metode untuk masing-masing tipe kejadian klik.
    500 Lalu implementasikan antarmuka itu dalam komponen host yang akan
    501 menerima kejadian tindakan dari dialog.</p>
    502 
    503 <p>Misalnya, berikut ini adalah {@link android.support.v4.app.DialogFragment} yang mendefinisikan
    504 antarmuka yang akan digunakan untuk mengirim kembali suatu kejadian ke aktivitas host:</p>
    505 
    506 <pre>
    507 public class NoticeDialogFragment extends DialogFragment {
    508 
    509     /* The activity that creates an instance of this dialog fragment must
    510      * implement this interface in order to receive event callbacks.
    511      * Each method passes the DialogFragment in case the host needs to query it. */
    512     public interface NoticeDialogListener {
    513         public void onDialogPositiveClick(DialogFragment dialog);
    514         public void onDialogNegativeClick(DialogFragment dialog);
    515     }
    516 
    517     // Use this instance of the interface to deliver action events
    518     NoticeDialogListener mListener;
    519 
    520     // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
    521     &#64;Override
    522     public void onAttach(Activity activity) {
    523         super.onAttach(activity);
    524         // Verify that the host activity implements the callback interface
    525         try {
    526             // Instantiate the NoticeDialogListener so we can send events to the host
    527             mListener = (NoticeDialogListener) activity;
    528         } catch (ClassCastException e) {
    529             // The activity doesn't implement the interface, throw exception
    530             throw new ClassCastException(activity.toString()
    531                     + " must implement NoticeDialogListener");
    532         }
    533     }
    534     ...
    535 }
    536 </pre>
    537 
    538 <p>Aktivitas yang menjadi host dialog tersebut akan membuat instance dialog
    539 dengan konstruktor fragmen dialog dan menerima kejadian dialog
    540 melalui implementasi antarmuka {@code NoticeDialogListener}:</p>
    541 
    542 <pre>
    543 public class MainActivity extends FragmentActivity
    544                           implements NoticeDialogFragment.NoticeDialogListener{
    545     ...
    546 
    547     public void showNoticeDialog() {
    548         // Create an instance of the dialog fragment and show it
    549         DialogFragment dialog = new NoticeDialogFragment();
    550         dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
    551     }
    552 
    553     // The dialog fragment receives a reference to this Activity through the
    554     // Fragment.onAttach() callback, which it uses to call the following methods
    555     // defined by the NoticeDialogFragment.NoticeDialogListener interface
    556     &#64;Override
    557     public void onDialogPositiveClick(DialogFragment dialog) {
    558         // User touched the dialog's positive button
    559         ...
    560     }
    561 
    562     &#64;Override
    563     public void onDialogNegativeClick(DialogFragment dialog) {
    564         // User touched the dialog's negative button
    565         ...
    566     }
    567 }
    568 </pre>
    569 
    570 <p>Karena aktivitas host mengimplementasikan {@code NoticeDialogListener}&mdash;yang
    571 diberlakukan oleh metode callback {@link android.support.v4.app.Fragment#onAttach onAttach()}
    572 di atas,&mdash;fragmen dialog bisa menggunakan
    573 metode callback antarmuka untuk mengirimkan kejadian klik ke aktivitas:</p>
    574 
    575 <pre>
    576 public class NoticeDialogFragment extends DialogFragment {
    577     ...
    578 
    579     &#64;Override
    580     public Dialog onCreateDialog(Bundle savedInstanceState) {
    581         // Build the dialog and set up the button click handlers
    582         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    583         builder.setMessage(R.string.dialog_fire_missiles)
    584                .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
    585                    public void onClick(DialogInterface dialog, int id) {
    586                        // Send the positive button event back to the host activity
    587                        mListener.onDialogPositiveClick(NoticeDialogFragment.this);
    588                    }
    589                })
    590                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    591                    public void onClick(DialogInterface dialog, int id) {
    592                        // Send the negative button event back to the host activity
    593                        mListener.onDialogNegativeClick(NoticeDialogFragment.this);
    594                    }
    595                });
    596         return builder.create();
    597     }
    598 }
    599 </pre>
    600 
    601 
    602 
    603 <h2 id="ShowingADialog">Menampilkan Dialog</h2>
    604 
    605 <p>Bila Anda ingin menampilkan dialog, buatlah instance {@link
    606 android.support.v4.app.DialogFragment} dan panggil {@link android.support.v4.app.DialogFragment#show
    607 show()}, dengan meneruskan {@link android.support.v4.app.FragmentManager} dan nama tag
    608 untuk fragmen dialognya.</p>
    609 
    610 <p>Anda bisa mendapatkan {@link android.support.v4.app.FragmentManager} dengan memanggil
    611 {@link android.support.v4.app.FragmentActivity#getSupportFragmentManager()} dari
    612  {@link android.support.v4.app.FragmentActivity} atau {@link
    613 android.support.v4.app.Fragment#getFragmentManager()} dari {@link
    614 android.support.v4.app.Fragment}. Misalnya:</p>
    615 
    616 <pre>
    617 public void confirmFireMissiles() {
    618     DialogFragment newFragment = new FireMissilesDialogFragment();
    619     newFragment.show(getSupportFragmentManager(), "missiles");
    620 }
    621 </pre>
    622 
    623 <p>Argumen kedua, {@code "missiles"}, adalah nama tag unik yang digunakan sistem untuk menyimpan
    624 dan memulihkan status fragmen bila diperlukan. Tag ini juga memungkinkan Anda mendapatkan handle ke
    625 fragmen dengan memanggil {@link android.support.v4.app.FragmentManager#findFragmentByTag
    626 findFragmentByTag()}.</p>
    627 
    628 
    629 
    630 
    631 <h2 id="FullscreenDialog">Menampilkan Dialog sebagai Layar Penuh atau Fragmen Tertanam</h2>
    632 
    633 <p>Anda mungkin memiliki desain UI yang di dalamnya Anda ingin UI muncul sebagai dialog dalam beberapa
    634 situasi, namun sebagai layar penuh atau fragmen tertanam dalam situasi lain (mungkin bergantung pada apakah
    635 perangkat memiliki layar besar atau layar kecil). Kelas {@link android.support.v4.app.DialogFragment}
    636 menawarkan fleksibilitas ini karena masih bisa berperilaku sebagai {@link
    637 android.support.v4.app.Fragment} yang bisa ditanamkan.</p>
    638 
    639 <p>Akan tetapi, dalam hal ini Anda tidak bisa menggunakan {@link android.app.AlertDialog.Builder AlertDialog.Builder}
    640 atau objek {@link android.app.Dialog} lain untuk membangun dialog. Jika
    641 Anda ingin {@link android.support.v4.app.DialogFragment}
    642 bisa ditanamkan, Anda harus mendefinisikan dialog UI dalam layout, lalu memuat layout itu dalam metode callback
    643 {@link android.support.v4.app.DialogFragment#onCreateView
    644 onCreateView()}.</p>
    645 
    646 <p>Berikut ini adalah contoh {@link android.support.v4.app.DialogFragment} yang bisa muncul sebagai
    647 dialog maupun fragmen yang bisa ditanamkan (menggunakan layout bernama <code>purchase_items.xml</code>):</p>
    648 
    649 <pre>
    650 public class CustomDialogFragment extends DialogFragment {
    651     /** The system calls this to get the DialogFragment's layout, regardless
    652         of whether it's being displayed as a dialog or an embedded fragment. */
    653     &#64;Override
    654     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    655             Bundle savedInstanceState) {
    656         // Inflate the layout to use as dialog or embedded fragment
    657         return inflater.inflate(R.layout.purchase_items, container, false);
    658     }
    659 
    660     /** The system calls this only when creating the layout in a dialog. */
    661     &#64;Override
    662     public Dialog onCreateDialog(Bundle savedInstanceState) {
    663         // The only reason you might override this method when using onCreateView() is
    664         // to modify any dialog characteristics. For example, the dialog includes a
    665         // title by default, but your custom layout might not need it. So here you can
    666         // remove the dialog title, but you must call the superclass to get the Dialog.
    667         Dialog dialog = super.onCreateDialog(savedInstanceState);
    668         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    669         return dialog;
    670     }
    671 }
    672 </pre>
    673 
    674 <p>Dan berikut ini adalah beberapa kode yang memutuskan apakah akan menampilkan fragmen sebagai dialog
    675 atau UI layar penuh, berdasarkan ukuran layar:</p>
    676 
    677 <pre>
    678 public void showDialog() {
    679     FragmentManager fragmentManager = getSupportFragmentManager();
    680     CustomDialogFragment newFragment = new CustomDialogFragment();
    681 
    682     if (mIsLargeLayout) {
    683         // The device is using a large layout, so show the fragment as a dialog
    684         newFragment.show(fragmentManager, "dialog");
    685     } else {
    686         // The device is smaller, so show the fragment fullscreen
    687         FragmentTransaction transaction = fragmentManager.beginTransaction();
    688         // For a little polish, specify a transition animation
    689         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    690         // To make it fullscreen, use the 'content' root view as the container
    691         // for the fragment, which is always the root view for the activity
    692         transaction.add(android.R.id.content, newFragment)
    693                    .addToBackStack(null).commit();
    694     }
    695 }
    696 </pre>
    697 
    698 <p>Untuk informasi selengkapnya tentang melakukan transaksi fragmen, lihat panduan
    699 <a href="{@docRoot}guide/components/fragments.html">Fragmen</a>.</p>
    700 
    701 <p>Dalam contoh ini, nilai boolean <code>mIsLargeLayout</code> menentukan apakah perangkat saat ini
    702 harus menggunakan desain layout besar aplikasi (dan dengan demikian menampilkan fragmen ini sebagai dialog, bukan
    703 layar penuh). Cara terbaik untuk mengatur jenis boolean ini adalah mendeklarasikan
    704 <a href="{@docRoot}guide/topics/resources/more-resources.html#Bool">nilai sumber daya boolean</a>
    705 dengan nilai <a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">sumber daya alternatif</a> untuk berbagai ukuran layar. Misalnya, berikut ini adalah dua
    706 versi sumber daya boolean untuk berbagai ukuran layar:</p>
    707 
    708 <p class="code-caption">res/values/bools.xml</p>
    709 <pre>
    710 &lt;!-- Default boolean values -->
    711 &lt;resources>
    712     &lt;bool name="large_layout">false&lt;/bool>
    713 &lt;/resources>
    714 </pre>
    715 
    716 <p class="code-caption">res/values-large/bools.xml</p>
    717 <pre>
    718 &lt;!-- Large screen boolean values -->
    719 &lt;resources>
    720     &lt;bool name="large_layout">true&lt;/bool>
    721 &lt;/resources>
    722 </pre>
    723 
    724 <p>Selanjutnya Anda bisa menetapkan nilai {@code mIsLargeLayout} selama
    725 metode {@link android.app.Activity#onCreate onCreate()} aktivitas:</p>
    726 
    727 <pre>
    728 boolean mIsLargeLayout;
    729 
    730 &#64;Override
    731 public void onCreate(Bundle savedInstanceState) {
    732     super.onCreate(savedInstanceState);
    733     setContentView(R.layout.activity_main);
    734 
    735     mIsLargeLayout = getResources().getBoolean(R.bool.large_layout);
    736 }
    737 </pre>
    738 
    739 
    740 
    741 <h3 id="ActivityAsDialog">Menampilkan aktivitas sebagai dialog pada layar besar</h3>
    742 
    743 <p>Sebagai ganti menampilkan dialog berupa UI layar penuh saat di layar kecil, Anda bisa memperoleh
    744 hasil yang sama dengan menampilkan {@link android.app.Activity} sebagai dialog saat di
    745 layar besar. Pendekatan yang Anda pilih bergantung pada desain aplikasi, namun
    746 menampilkan aktivitas sebagai dialog sering kali berguna bila aplikasi Anda sudah didesain untuk
    747 layar kecil dan Anda ingin meningkatkan pengalaman pada tablet dengan menampilkan aktivitas berjangka pendek
    748 sebagai dialog.</p>
    749 
    750 <p>Untuk menampilkan aktivitas sebagai dialog hanya saat di layar besar,
    751 terapkan tema {@link android.R.style#Theme_Holo_DialogWhenLarge Theme.Holo.DialogWhenLarge}
    752  pada elemen manifes <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
    753 &lt;activity&gt;}</a>:</p>
    754 
    755 <pre>
    756 &lt;activity android:theme="&#64;android:style/Theme.Holo.DialogWhenLarge" >
    757 </pre>
    758 
    759 <p>Untuk informasi selengkapnya tentang mengatur gaya aktivitas Anda dengan tema, lihat panduan <a href="{@docRoot}guide/topics/ui/themes.html">Gaya dan Tema</a>.</p>
    760 
    761 
    762 
    763 <h2 id="DismissingADialog">Menutup Dialog</h2>
    764 
    765 <p>Bila pengguna menyentuh salah satu tombol tindakan yang dibuat dengan
    766 {@link android.app.AlertDialog.Builder}, sistem akan menutup dialog untuk Anda.</p>
    767 
    768 <p>Sistem juga menutup dialog bila pengguna menyentuh sebuah item dalam daftar dialog, kecuali
    769 bila daftar itu menggunakan tombol radio atau kotak cek. Jika tidak, Anda bisa menutup dialog secara manual
    770 dengan memanggil {@link android.support.v4.app.DialogFragment#dismiss()} pada {@link
    771 android.support.v4.app.DialogFragment} Anda.</p>
    772 
    773 <p>Jika Anda perlu melakukan
    774 tindakan tertentu saat dialog menghilang, Anda bisa menerapkan metode {@link
    775 android.support.v4.app.DialogFragment#onDismiss onDismiss()} dalam {@link
    776 android.support.v4.app.DialogFragment} Anda.</p>
    777 
    778 <p>Anda juga bisa <em>membatalkan</em> dialog. Ini merupakan kejadian khusus yang menunjukkan bahwa pengguna
    779 secara eksplisit meninggalkan dialog tanpa menyelesaikan tugas. Hal ini terjadi jika pengguna menekan tombol
    780 <em>Back</em>, menyentuh layar di luar area dialog,
    781 atau jika Anda secara eksplisit memanggil {@link android.app.Dialog#cancel()} pada {@link
    782 android.app.Dialog} (seperti saat merespons tombol "Cancel" dalam dialog).</p>
    783 
    784 <p>Seperti yang ditampilkan dalam contoh di atas, Anda bisa merespons kejadian batal dengan menerapkan
    785 {@link android.support.v4.app.DialogFragment#onCancel onCancel()} dalam kelas {@link
    786 android.support.v4.app.DialogFragment} Anda.</p>
    787 
    788 <p class="note"><strong>Catatan:</strong> Sistem akan memanggil
    789 {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} pada tiap kejadian yang
    790 memanggil callback {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Akan tetapi,
    791 jika Anda memanggil {@link android.app.Dialog#dismiss Dialog.dismiss()} atau {@link
    792 android.support.v4.app.DialogFragment#dismiss DialogFragment.dismiss()},
    793 sistem akan memanggil {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} <em>namun
    794 bukan</em> {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Jadi biasanya Anda harus
    795 memanggil {@link android.support.v4.app.DialogFragment#dismiss dismiss()} bila pengguna menekan tombol
    796 <em>positif</em> dalam dialog untuk menghilangkan tampilan dialog.</p>
    797 
    798 
    799