• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &amp;
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&mdash;termasuk
111layout 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}
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    &#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>
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&#64;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&#64;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               &#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
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&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}
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&#64;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               &#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,
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&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
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    &#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
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    &#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
571diberlakukan oleh metode callback {@link android.support.v4.app.Fragment#onAttach onAttach()}
572di atas,&mdash;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    &#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
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    &#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
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&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
725metode {@link android.app.Activity#onCreate onCreate()} aktivitas:</p>
726
727<pre>
728boolean mIsLargeLayout;
729
730&#64;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&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
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