1page.title=Dialog 2page.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 45membuat keputusan atau memasukkan informasi tambahan. Dialog tidak mengisi layar dan 46biasanya 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 57harus menghindari pembuatan instance {@link android.app.Dialog} secara langsung. 58Sebagai 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 71perlu menunjukkan kemajuan pemuatan ataupun kemajuan yang tidak pasti, maka Anda harus mengikuti 72panduan desain untuk <a href="{@docRoot}design/building-blocks/progress.html">Kemajuan & 73Aktivitas</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 77menggunakan {@link android.support.v4.app.DialogFragment} sebagai kontainer dialog Anda. 78Kelas {@link android.support.v4.app.DialogFragment} menyediakan semua kontrol yang Anda 79perlukan untuk membuat dialog dan mengelola penampilannya, sebagai ganti memanggil metode 80pada objek {@link android.app.Dialog}.</p> 81 82<p>Menggunakan {@link android.support.v4.app.DialogFragment} untuk mengelola dialog 83akan memastikan bahwa kelas itu menangani kejadian daur hidup 84dengan benar seperti ketika pengguna menekan tombol <em>Back</em> atau memutar layar. Kelas {@link 85android.support.v4.app.DialogFragment} juga memungkinkan Anda menggunakan ulang dialog UI sebagai 86komponen yang bisa ditanamkan dalam UI yang lebih besar, persis seperti {@link 87android.support.v4.app.Fragment} tradisional (seperti saat Anda ingin dialog UI muncul berbeda 88pada layar besar dan kecil).</p> 89 90<p>Bagian-bagian berikutnya dalam panduan ini akan menjelaskan cara menggunakan {@link 91android.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> 96Karena kelas {@link android.app.DialogFragment} mulanya ditambahkan pada 97Android 3.0 (API level 11), dokumen ini menjelaskan cara menggunakan kelas {@link 98android.support.v4.app.DialogFragment} yang disediakan bersama <a href="{@docRoot}tools/support-library/index.html">Pustaka Dukungan</a>. Dengan menambahkan pustaka ini 99ke aplikasi, Anda bisa menggunakan {@link android.support.v4.app.DialogFragment} dan berbagai 100API lain pada perangkat yang menjalankan Android 1.6 atau yang lebih tinggi. Jika versi minimum yang didukung aplikasi Anda 101adalah API level 11 atau yang lebih tinggi, maka Anda bisa menggunakan versi kerangka kerja {@link 102android.app.DialogFragment}, namun ketahuilah bahwa tautan dalam dokumen ini adalah untuk API 103pustaka dukungan. Saat menggunakan pustaka dukungan, 104pastikan Anda mengimpor kelas <code>android.support.v4.app.DialogFragment</code> 105dan <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 111layout 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} 114dalam metode callback {@link android.support.v4.app.DialogFragment#onCreateDialog 115onCreateDialog()}.</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> 121public 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> 146Dialog dengan satu pesan dan dua tombol tindakan.</p> 147</div> 148 149<p>Sekarang, bila Anda membuat instance kelas ini dan memanggil {@link 150android.support.v4.app.DialogFragment#show show()} pada objek itu, dialog akan muncul seperti 151yang ditampilkan dalam gambar 1.</p> 152 153<p>Bagian berikutnya menjelaskan lebih jauh tentang penggunaan API {@link android.app.AlertDialog.Builder} 154untuk membuat dialog.</p> 155 156<p>Bergantung pada seberapa rumit dialog tersebut, Anda bisa menerapkan berbagai metode callback lain 157dalam {@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 168seringkali satu-satunya kelas dialog yang akan Anda perlukan. 169Seperti 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} 189dengan 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> 195AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 196 197<b>// 2. Chain together various setter methods to set the dialog characteristics</b> 198builder.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> 202AlertDialog dialog = builder.create(); 203</pre> 204 205<p>Topik-topik selanjutnya menampilkan cara mendefinisikan berbagai atribut dialog dengan menggunakan 206kelas {@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, 214panggil metode {@link android.app.AlertDialog.Builder#setPositiveButton setPositiveButton()} dan 215{@link android.app.AlertDialog.Builder#setNegativeButton setNegativeButton()}:</p> 216 217<pre style="clear:right"> 218AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 219// Add the buttons 220builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 221 public void onClick(DialogInterface dialog, int id) { 222 // User clicked OK button 223 } 224 }); 225builder.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 234AlertDialog dialog = builder.create(); 235</pre> 236 237<p>Metode <code>set...Button()</code> mengharuskan adanya judul bagi tombol (disediakan 238oleh 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 240bila 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 251tombol negatif. Misalnya, tindakan bisa berupa "Ingatkan saya nanti".</dd> 252</dl> 253 254<p>Anda hanya bisa menambahkan salah satu tipe tombol ke {@link 255android.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> 262Dialog 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, 275gunakan metode {@link android.app.AlertDialog.Builder#setItems setItems()}:</p> 276 277<pre style="clear:right"> 278@Override 279public 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, 293dialog tidak bisa menampilkan pesan dan daftar sekaligus dan Anda harus menetapkan judul untuk 294dialog dengan {@link android.app.AlertDialog.Builder#setTitle setTitle()}. 295Untuk menentukan item daftar, panggil {@link 296android.app.AlertDialog.Builder#setItems setItems()}, dengan meneruskan larik. 297Atau, Anda bisa menetapkan daftar menggunakan {@link 298android.app.AlertDialog.Builder#setAdapter setAdapter()}. Hal ini memungkinkan Anda mendukung daftar 299dengan 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}, 302selalu gunakan sebuah {@link android.support.v4.content.Loader} agar konten dimuat 303secara asinkron. Hal ini dijelaskan lebih jauh dalam panduan 304<a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">Membuat Layout 305dengan 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, 309kecuali 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> 314Daftar 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 321item pilihan tunggal (tombol radio), gunakan masing-masing metode 322{@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String, 323DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()}, atau 324{@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 325setSingleChoiceItems()}.</p> 326 327<p>Misalnya, berikut ini cara membuat daftar pilihan ganda seperti 328yang ditampilkan dalam gambar 4 yang menyimpan item 329yang dipilih dalam {@link java.util.ArrayList}:</p> 330 331<pre style="clear:right"> 332@Override 333public 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 375menyediakan tindakan "pilihan tunggal", Anda harus menggunakan {@link 376android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 377setSingleChoiceItems()} jika ingin mempertahankan pilihan pengguna. 378Yakni, jika nanti membuka dialog lagi untuk menunjukkan pilihan pengguna, 379maka 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 394android.app.AlertDialog.Builder#setView setView()} pada objek {@link 395android.app.AlertDialog.Builder} Anda.</p> 396 397<p>Secara default, layout custom akan mengisi jendela dialog, namun Anda masih bisa 398menggunakan 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} 440agar menggunakan tipe input {@code "textPassword"}, keluarga font akan diatur ke spasi tunggal, sehingga 441Anda harus mengubah keluarga font ke {@code "sans-serif"} sehingga kedua bidang teks menggunakan 442gaya font yang cocok.</p> 443 444<p>Untuk memekarkan layout dalam {@link android.support.v4.app.DialogFragment} Anda, 445ambillah {@link android.view.LayoutInflater} dengan 446{@link android.app.Activity#getLayoutInflater()} dan panggil 447{@link android.view.LayoutInflater#inflate inflate()}, dengan parameter pertama 448adalah ID sumber daya layout dan parameter kedua adalah tampilan induk untuk layout. 449Selanjutnya Anda bisa memanggil {@link android.app.AlertDialog#setView setView()} 450untuk menempatkan layout dalam dialog.</p> 451 452<pre> 453@Override 454public 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, 480Anda bisa menampilkan {@link android.app.Activity} sebagai dialog 481daripada 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} 483di 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 499membuka dialog. Caranya, definisikan antarmuka dengan sebuah metode untuk masing-masing tipe kejadian klik. 500Lalu implementasikan antarmuka itu dalam komponen host yang akan 501menerima kejadian tindakan dari dialog.</p> 502 503<p>Misalnya, berikut ini adalah {@link android.support.v4.app.DialogFragment} yang mendefinisikan 504antarmuka yang akan digunakan untuk mengirim kembali suatu kejadian ke aktivitas host:</p> 505 506<pre> 507public 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 539dengan konstruktor fragmen dialog dan menerima kejadian dialog 540melalui implementasi antarmuka {@code NoticeDialogListener}:</p> 541 542<pre> 543public 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 571diberlakukan oleh metode callback {@link android.support.v4.app.Fragment#onAttach onAttach()} 572di atas,—fragmen dialog bisa menggunakan 573metode callback antarmuka untuk mengirimkan kejadian klik ke aktivitas:</p> 574 575<pre> 576public 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 606android.support.v4.app.DialogFragment} dan panggil {@link android.support.v4.app.DialogFragment#show 607show()}, dengan meneruskan {@link android.support.v4.app.FragmentManager} dan nama tag 608untuk 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 613android.support.v4.app.Fragment#getFragmentManager()} dari {@link 614android.support.v4.app.Fragment}. Misalnya:</p> 615 616<pre> 617public 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 624dan memulihkan status fragmen bila diperlukan. Tag ini juga memungkinkan Anda mendapatkan handle ke 625fragmen dengan memanggil {@link android.support.v4.app.FragmentManager#findFragmentByTag 626findFragmentByTag()}.</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 634situasi, namun sebagai layar penuh atau fragmen tertanam dalam situasi lain (mungkin bergantung pada apakah 635perangkat memiliki layar besar atau layar kecil). Kelas {@link android.support.v4.app.DialogFragment} 636menawarkan fleksibilitas ini karena masih bisa berperilaku sebagai {@link 637android.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} 640atau objek {@link android.app.Dialog} lain untuk membangun dialog. Jika 641Anda ingin {@link android.support.v4.app.DialogFragment} 642bisa ditanamkan, Anda harus mendefinisikan dialog UI dalam layout, lalu memuat layout itu dalam metode callback 643{@link android.support.v4.app.DialogFragment#onCreateView 644onCreateView()}.</p> 645 646<p>Berikut ini adalah contoh {@link android.support.v4.app.DialogFragment} yang bisa muncul sebagai 647dialog maupun fragmen yang bisa ditanamkan (menggunakan layout bernama <code>purchase_items.xml</code>):</p> 648 649<pre> 650public 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 675atau UI layar penuh, berdasarkan ukuran layar:</p> 676 677<pre> 678public 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 702harus menggunakan desain layout besar aplikasi (dan dengan demikian menampilkan fragmen ini sebagai dialog, bukan 703layar 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> 705dengan nilai <a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">sumber daya alternatif</a> untuk berbagai ukuran layar. Misalnya, berikut ini adalah dua 706versi 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 725metode {@link android.app.Activity#onCreate onCreate()} aktivitas:</p> 726 727<pre> 728boolean mIsLargeLayout; 729 730@Override 731public 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 744hasil yang sama dengan menampilkan {@link android.app.Activity} sebagai dialog saat di 745layar besar. Pendekatan yang Anda pilih bergantung pada desain aplikasi, namun 746menampilkan aktivitas sebagai dialog sering kali berguna bila aplikasi Anda sudah didesain untuk 747layar kecil dan Anda ingin meningkatkan pengalaman pada tablet dengan menampilkan aktivitas berjangka pendek 748sebagai dialog.</p> 749 750<p>Untuk menampilkan aktivitas sebagai dialog hanya saat di layar besar, 751terapkan 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 769bila daftar itu menggunakan tombol radio atau kotak cek. Jika tidak, Anda bisa menutup dialog secara manual 770dengan memanggil {@link android.support.v4.app.DialogFragment#dismiss()} pada {@link 771android.support.v4.app.DialogFragment} Anda.</p> 772 773<p>Jika Anda perlu melakukan 774tindakan tertentu saat dialog menghilang, Anda bisa menerapkan metode {@link 775android.support.v4.app.DialogFragment#onDismiss onDismiss()} dalam {@link 776android.support.v4.app.DialogFragment} Anda.</p> 777 778<p>Anda juga bisa <em>membatalkan</em> dialog. Ini merupakan kejadian khusus yang menunjukkan bahwa pengguna 779secara eksplisit meninggalkan dialog tanpa menyelesaikan tugas. Hal ini terjadi jika pengguna menekan tombol 780<em>Back</em>, menyentuh layar di luar area dialog, 781atau jika Anda secara eksplisit memanggil {@link android.app.Dialog#cancel()} pada {@link 782android.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 786android.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 790memanggil callback {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Akan tetapi, 791jika Anda memanggil {@link android.app.Dialog#dismiss Dialog.dismiss()} atau {@link 792android.support.v4.app.DialogFragment#dismiss DialogFragment.dismiss()}, 793sistem akan memanggil {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} <em>namun 794bukan</em> {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Jadi biasanya Anda harus 795memanggil {@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