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 & 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—termasuk 111 layout custom dan desain yang dijelaskan dalam panduan desain <a href="{@docRoot}design/building-blocks/dialogs.html">Dialog</a> 112 —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 @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 @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 @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 @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 @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 @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 <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 <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 <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 <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 </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 @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 @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 <activity>}</a>:</p> 485 486 <pre> 487 <activity android:theme="@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 @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 @Override 557 public void onDialogPositiveClick(DialogFragment dialog) { 558 // User touched the dialog's positive button 559 ... 560 } 561 562 @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}—yang 571 diberlakukan oleh metode callback {@link android.support.v4.app.Fragment#onAttach onAttach()} 572 di atas,—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 @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 @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 @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 <!-- Default boolean values --> 711 <resources> 712 <bool name="large_layout">false</bool> 713 </resources> 714 </pre> 715 716 <p class="code-caption">res/values-large/bools.xml</p> 717 <pre> 718 <!-- Large screen boolean values --> 719 <resources> 720 <bool name="large_layout">true</bool> 721 </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 @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 <activity>}</a>:</p> 754 755 <pre> 756 <activity android:theme="@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