1 page.title=Caixas de dilogo 2 page.tags=dilogodealerta,fragmentodedilogo 3 4 @jd:body 5 6 7 8 <div id="qv-wrapper"> 9 <div id="qv"> 10 <h2>Neste documento</h2> 11 <ol> 12 <li><a href="#DialogFragment">Criao de um fragmento de caixa de dilogo</a></li> 13 <li><a href="#AlertDialog">Construo de uma caixa de dilogo de alerta</a> 14 <ol> 15 <li><a href="#AddingButtons">Adio de botes</a></li> 16 <li><a href="#AddingAList">Adio de listas</a></li> 17 <li><a href="#CustomLayout">Criao de layout personalizado</a></li> 18 </ol> 19 </li> 20 <li><a href="#PassingEvents">Direcionamento de eventos de volta ao host da caixa de dilogo</a></li> 21 <li><a href="#ShowingADialog">Exibio de uma caixa de dilogo</a></li> 22 <li><a href="#FullscreenDialog">Exibio de uma caixa de dilogo em tela cheia ou como um fragmento incorporado</a> 23 <ol> 24 <li><a href="#ActivityAsDialog">Exibio de uma atividade como uma caixa de dilogo em telas grandes</a></li> 25 </ol> 26 </li> 27 <li><a href="#DismissingADialog">Dispensa de uma caixa de dilogo</a></li> 28 </ol> 29 30 <h2>Classes principais</h2> 31 <ol> 32 <li>{@link android.app.DialogFragment}</li> 33 <li>{@link android.app.AlertDialog}</li> 34 </ol> 35 36 <h2>Veja tambm</h2> 37 <ol> 38 <li><a href="{@docRoot}design/building-blocks/dialogs.html">Guia de projeto de caixas de dilogo</a></li> 39 <li><a href="{@docRoot}guide/topics/ui/controls/pickers.html">Seletores</a> (caixas de dilogo de data e hora)</li> 40 </ol> 41 </div> 42 </div> 43 44 <p>As caixas de dilogo so pequenas janelas que levam o usurio 45 a tomar uma deciso ou inserir informaes adicionais. Elas no ocupam toda a tela e so 46 normalmente susada para eventos modais que exijam que usurios realizem uma ao antes de continuar.</p> 47 48 <div class="note design"> 49 <p><strong>Projeto de caixas de dilogo</strong></p> 50 <p>Para obter mais informaes sobre como projetar caixas de dilogo, inclusive sobre recomendaes 51 de idioma, leia o guia de projeto <a href="{@docRoot}design/building-blocks/dialogs.html">Caixas de dilogo</a>.</p> 52 </div> 53 54 <img src="{@docRoot}images/ui/dialogs.png" /> 55 56 <p>A classe {@link android.app.Dialog} a classe de base para caixas de dilogo, mas 57 deve-se evitar instanciar {@link android.app.Dialog} diretamente. 58 Em vez disso, use uma das subclasses a seguir:</p> 59 <dl> 60 <dt>{@link android.app.AlertDialog}</dt> 61 <dd>Caixa de dilogo que pode exibir um ttulo, at trs botes, uma lista 62 de itens selecionveis ou um layout personalizado.</dd> 63 <dt>{@link android.app.DatePickerDialog} ou {@link android.app.TimePickerDialog}</dt> 64 <dd>Caixa de dilogo com uma IU predefinida que permite ao usurio selecionar uma data ou hora.</dd> 65 </dl> 66 67 <div class="sidebox"> 68 <h2>Evite ProgressDialog</h2> 69 <p>O Android tem outra classe de caixa de dilogo chamada 70 {@link android.app.ProgressDialog}, que exibe uma caixa de dilogo com uma barra de andamento. Entretanto, se for 71 necessrio indicar carregamento ou andamento indeterminado, deve-se seguir as orientaes 72 de projeto de <a href="{@docRoot}design/building-blocks/progress.html">Progresso e 73 atividade</a> e usar uma {@link android.widget.ProgressBar} no layout.</p> 74 </div> 75 76 <p>Essas classes definem o estilo e a estrutura da caixa de dilogo, mas deve-se 77 usar um {@link android.support.v4.app.DialogFragment} como um continer para a caixa de dilogo. 78 A classe {@link android.support.v4.app.DialogFragment} fornece todos os controles 79 necessrios para criar uma caixa de dilogo e gerenciar sua aparncia em vez de chamar mtodos 80 no objeto {@link android.app.Dialog}.</p> 81 82 <p>O uso de {@link android.support.v4.app.DialogFragment} para gerenciar a caixa de dilogo 83 garante que ela trate corretamente os eventos de ciclos de vida, 84 como quando o usurio pressiona o boto <em>Voltar</em> ou gira a tela. A classe {@link 85 android.support.v4.app.DialogFragment} tambm permite a reutilizao da IU da caixa de dilogo como 86 um componente incorporvel em uma IU maior, assim como um {@link 87 android.support.v4.app.Fragment} tradicional (como nas vezes em que se deseja que a IU da caixa de dilogo aparea de modos diferentes 88 em telas grandes e pequenas).</p> 89 90 <p>As sees a seguir neste guia descrevem como usar um {@link 91 android.support.v4.app.DialogFragment} combinado com um objeto 92 {@link android.app.AlertDialog}. Se voc quiser criar um seletor de data ou hora, leia o guia 93 <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Seletores</a>.</p> 94 95 <p class="note"><strong>Observao:</strong> 96 como a classe {@link android.app.DialogFragment} foi adicionada originalmente com 97 o Android 3.0 (API de nvel 11), este documento descreve como usar a classe {@link 98 android.support.v4.app.DialogFragment} fornecida com a <a href="{@docRoot}tools/support-library/index.html">Biblioteca de Suporte</a>. Ao adicionar essa biblioteca 99 ao aplicativo, pode-se usar {@link android.support.v4.app.DialogFragment} e uma variedade de outras 100 APIs em dispositivos que executam o Android 1.6 ou verso posterior. Se a verso mais antiga com a qual seu aplicativo compatvel 101 for a API de nvel 11 ou posterior, possvel usar a verso de estrutura de {@link 102 android.app.DialogFragment}, mas esteja ciente de que os links neste documento so para APIs 103 de biblioteca de suporte. Ao usar a biblioteca de suporte, 104 certifique-se de importar a classe <code>android.support.v4.app.DialogFragment</code> 105 e <em>no</em> a <code>android.app.DialogFragment</code>.</p> 106 107 108 <h2 id="DialogFragment">Criao de um fragmento de caixa de dilogo</h2> 109 110 <p> possvel realizar uma grande variedade de projetos de caixas de dilogo — inclusive 111 layouts personalizados e outros descritos no guia de projeto <a href="{@docRoot}design/building-blocks/dialogs.html">Caixas de dilogo</a> 112 —, estendendo 113 {@link android.support.v4.app.DialogFragment} e criando uma{@link android.app.AlertDialog} 114 no mtodo de retorno de chamada {@link android.support.v4.app.DialogFragment#onCreateDialog 115 onCreateDialog()}.</p> 116 117 <p>Por exemplo, a seguir h um {@link android.app.AlertDialog} bsico gerenciado dentro 118 de um {@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>Figura 1.</strong> 146 Caixa de dilogo com uma mensagem e dois botes de ao.</p> 147 </div> 148 149 <p>Ao criar uma instncia dessa classe e chamar {@link 150 android.support.v4.app.DialogFragment#show show()} nesse objeto, a caixa de dilogo ser exibida como 151 ilustrado na figura 1.</p> 152 153 <p>A prxima seo descreve em mais detalhes o uso das APIs{@link android.app.AlertDialog.Builder} 154 para a criao de uma caixa de dilogo.</p> 155 156 <p>Conforme o nvel de complexidade da caixa de dilogo, possvel implementar diversos outros mtodos 157 de retorno de chamada no {@link android.support.v4.app.DialogFragment}, inclusive todos os 158 <a href="{@docRoot}guide/components/fragments.html#Lifecycle">mtodos de ciclo de vida de fragmentos</a> bsicos. 159 160 161 162 163 164 <h2 id="AlertDialog">Construo de uma caixa de dilogo de alerta</h2> 165 166 167 <p>A classe {@link android.app.AlertDialog} permite a criao de diversos projetos de caixa de dilogo 168 e normalmente a nica classe de caixa de dilogo necessria. 169 Como ilustrado na figura 2, h trs regies de uma caixa de dilogo de alerta:</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>Figura 2.</strong> Layout de uma caixa de dilogo.</p> 174 </div> 175 176 <ol> 177 <li><b>Ttulo</b> 178 <p> opcional e deve ser usado somente quando a rea do contedo 179 estiver ocupada por uma mensagem detalhada, uma lista ou layout personalizado. Se for necessrio declarar 180 uma mensagem ou pergunta simples (como a caixa de dilogo na figura 1), o ttulo no necessrio.</li> 181 <li><b>rea do contedo</b> 182 <p>Pode exibir uma mensagem, uma lista ou outro layout personalizado.</p></li> 183 <li><b>Botes de ao</b> 184 <p>No deve haver mais de trs botes em uma caixa de dilogo.</p></li> 185 </ol> 186 187 <p>A classe {@link android.app.AlertDialog.Builder} 188 fornece APIs que permitem a criao de uma {@link android.app.AlertDialog} 189 com esses tipos de contedo, inclusive um layout personalizado.</p> 190 191 <p>Para criar uma {@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>Os tpicos a seguir mostram como definir diversos atributos de caixas de dilogo 206 com a classe {@link android.app.AlertDialog.Builder}.</p> 207 208 209 210 211 <h3 id="AddingButtons">Adio de botes</h3> 212 213 <p>Para adicionar botes de ao como os da figura 2, 214 chame os mtodos {@link android.app.AlertDialog.Builder#setPositiveButton setPositiveButton()} e 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>Os mtodos <code>set...Button()</code> exigem um ttulo para o boto (fornecido 238 por um <a href="{@docRoot}guide/topics/resources/string-resource.html">recurso de string</a>) e um 239 {@link android.content.DialogInterface.OnClickListener} que defina a ao a realizar 240 quando o usurio pressionar o boto.</p> 241 242 <p>H trs botes de ao diferente que podem ser adicionados:</p> 243 <dl> 244 <dt>Positivo</dt> 245 <dd> o que se deve usar para aceitar e continuar a ao (a ao "OK").</dd> 246 <dt>Negativo</dt> 247 <dd> o que se deve usar para cancelar a ao.</dd> 248 <dt>Neutro</dt> 249 <dd> o que se deve usar quando houver a opo de o usurio no querer continuar a ao, 250 mas no necessariamente cancel-la. Ele aparece entre os botes positivo 251 e negativo. Por exemplo: a ao pode ser "Notifique-me mais tarde".</dd> 252 </dl> 253 254 <p> possvel adicionar somente um de cada tipo de boto a uma {@link 255 android.app.AlertDialog}, ou seja, no possvel ter mais de um boto "positivo".</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>Figura 3.</strong> 262 Caixa de dilogo com um ttulo e uma lista.</p> 263 </div> 264 265 <h3 id="AddingAList">Adio de listas</h3> 266 267 <p>H trs tipos de listas disponveis nas APIs {@link android.app.AlertDialog}:</p> 268 <ul> 269 <li>Lista de escolha nica tradicional</li> 270 <li>Lista de escolha nica persistente (botes de opo)</li> 271 <li>Lista de escolhas mltiplas persistentes (caixas de seleo)</li> 272 </ul> 273 274 <p>Para criar uma lista de escolha nica como a da figura 3, 275 use o mtodo {@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>Como a lista aparece na rea do contedo da caixa de dilogo, 293 a caixa no pode exibir uma mensagem e uma lista, e ser preciso definir um ttulo 294 para ela com {@link android.app.AlertDialog.Builder#setTitle setTitle()}. 295 Para especificar os itens da lista, chame {@link 296 android.app.AlertDialog.Builder#setItems setItems()} passando uma matriz. 297 Alternativamente, possvel especificar uma lista com {@link 298 android.app.AlertDialog.Builder#setAdapter setAdapter()}. Isso permite retroceder a lista 299 com dados dinmicos (como os de um banco de dados) com um {@link android.widget.ListAdapter}.</p> 300 301 <p>Se voc optar por retroceder a lista com um {@link android.widget.ListAdapter}, 302 sempre use um {@link android.support.v4.content.Loader} para que o contedo carregue 303 assincronamente. Veja mais detalhes sobre isso nos guias 304 <a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">Criao de layouts 305 com um adaptador</a> e 306 <a href="{@docRoot}guide/components/loaders.html">Carregadores</a>.</p> 307 308 <p class="note"><strong>Observao:</strong> por padro, o toque em um item de lista dispensa a caixa de dilogo 309 a menos que voc esteja usando uma das listas de escolha persistentes a seguir.</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>Figura 4.</strong> 314 Lista de itens de mltipla escolha.</p> 315 </div> 316 317 318 <h4 id="Checkboxes">Adio de uma lista de escolha nica ou de mltipla escolha persistente</h4> 319 320 <p>Para adicionar uma lista de itens de mltipla escolha (caixas de seleo) 321 ou itens de escolha nica (botes de rdio), use os mtodos 322 {@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String, 323 DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()} ou 324 {@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 325 setSingleChoiceItems()} respectivamente.</p> 326 327 <p>Por exemplo, a seguir apresenta-se como criar uma lista de mltipla escolha como 328 a ilustrada na figura 4, que salva os itens 329 selecionados em uma {@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>Embora a lista tradicional e uma lista com botes de opo 375 forneam uma ao de "escolha nica", deve-se usar {@link 376 android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 377 setSingleChoiceItems()} se voc desejar manter a escolha do usurio. 378 Ou seja, se a caixa de dilogo abrir novamente mais tarde, deve indicar qual a escolha atual do usurio, 379 portanto deve-se criar uma lista com botes de opo.</p> 380 381 382 383 384 385 <h3 id="CustomLayout">Criao de layout personalizado</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>Figura 5.</strong> Layout personalizado da caixa de dilogo.</p> 390 </div> 391 392 <p>Se voc deseja um layout personalizado em uma caixa de dilogo, crie um layout e adicione-o a uma 393 {@link android.app.AlertDialog} chamando {@link 394 android.app.AlertDialog.Builder#setView setView()} no objeto {@link 395 android.app.AlertDialog.Builder}.</p> 396 397 <p>Por padro, o layout personalizado preenche a janela da caixa de dilogo, mas ainda possvel 398 usar mtodos {@link android.app.AlertDialog.Builder} para adicionar botes e um ttulo.</p> 399 400 <p>Por exemplo, a seguir h o arquivo de layout para a caixa de dilogo na figura 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>Dica:</strong> por padro, ao definir um elemento 440 {@link android.widget.EditText} para usar o tipo de entrada {@code "textPassword"}, a famlia da fonte definida como de espao nico, portanto 441 deve-se alterar a famlia da fonte para {@code "sans-serif"} para que os campos de texto usem 442 um estilo de fonte compatvel.</p> 443 444 <p>Para inflar o layout no {@link android.support.v4.app.DialogFragment}, 445 obtenha um {@link android.view.LayoutInflater} com 446 {@link android.app.Activity#getLayoutInflater()} e chame 447 {@link android.view.LayoutInflater#inflate inflate()}, em que o primeiro parmetro 448 o ID de recurso do layout e o segundo uma vista pai do layout. 449 Em seguida, pode-se chamar {@link android.app.AlertDialog#setView setView()} 450 para posicionar o layout na caixa de dilogo.</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>Dica:</strong> se voc deseja uma caixa de dilogo personalizada, 480 pode exibir uma {@link android.app.Activity} como uma caixa de dilogo 481 em vez de usar as APIs {@link android.app.Dialog}. Basta criar uma atividade e definir seu tema como 482 {@link android.R.style#Theme_Holo_Dialog Theme.Holo.Dialog} 483 no elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code 484 <activity>}</a> do manifesto:</p> 485 486 <pre> 487 <activity android:theme="@android:style/Theme.Holo.Dialog" > 488 </pre> 489 <p>Pronto. Agora a atividade exibida em uma janela da caixa de dilogo em vez de tela cheia.</p> 490 </div> 491 492 493 494 <h2 id="PassingEvents">Direcionamento de eventos de volta ao host da caixa de dilogo</h2> 495 496 <p>Quando o usurio toca em um dos botes de ao da caixa de dilogo ou seleciona um item de sua lista, 497 o {@link android.support.v4.app.DialogFragment} pode realizar a ao 498 necessria sozinho, mas normalmente ser necessrio fornecer o evento atividade ou ao fragmento 499 que abriu a caixa de dilogo. Para isso, defina uma interface com um mtodo para cada tipo de evento de clique. 500 Em seguida, implemente essa interface no componente do host 501 que receber os eventos de ao da caixa de dilogo.</p> 502 503 <p>Por exemplo, a seguir h um {@link android.support.v4.app.DialogFragment} que define 504 uma interface por meio da qual entrega os eventos de volta atividade do 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>A atividade que hospeda a caixa de dilogo cria uma instncia da caixa 539 com o construtor do fragmento da caixa de dilogo e recebe os eventos 540 dela por meio de uma implementao da interface {@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>Como a atividade do host implementa o {@code NoticeDialogListener} — que 571 forado pelo mtodo de retorno de chamada {@link android.support.v4.app.Fragment#onAttach onAttach()} 572 exibido acima —, o fragmento da caixa de dilogo pode usar 573 os mtodos de retorno de chamada da interface para entregar eventos de clique atividade:</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">Exibio de uma caixa de dilogo</h2> 604 605 <p>Para exibir a caixa de dilogo, crie uma instncia do {@link 606 android.support.v4.app.DialogFragment} e chame {@link android.support.v4.app.DialogFragment#show 607 show()} passando o {@link android.support.v4.app.FragmentManager} e um nome de tag 608 para o fragmento da caixa de dilogo.</p> 609 610 <p>Para obter o {@link android.support.v4.app.FragmentManager}, chama-se 611 {@link android.support.v4.app.FragmentActivity#getSupportFragmentManager()} 612 da {@link android.support.v4.app.FragmentActivity} ou {@link 613 android.support.v4.app.Fragment#getFragmentManager()} de um {@link 614 android.support.v4.app.Fragment}. Por exemplo:</p> 615 616 <pre> 617 public void confirmFireMissiles() { 618 DialogFragment newFragment = new FireMissilesDialogFragment(); 619 newFragment.show(getSupportFragmentManager(), "missiles"); 620 } 621 </pre> 622 623 <p>O segundo argumento, {@code "missiles"}, um nome de tag exclusivo que o sistema usa para salvar 624 e restaurar o estado do fragmento quando necessrio. Para que a tag obtenha um identificador 625 do fragmento, chama-se {@link android.support.v4.app.FragmentManager#findFragmentByTag 626 findFragmentByTag()}.</p> 627 628 629 630 631 <h2 id="FullscreenDialog">Exibio de uma caixa de dilogo em tela cheia ou como um fragmento incorporado</h2> 632 633 <p>Pode-se ter um projeto de IU em que uma parte da IU aparea como uma caixa de dilogo em determinadas 634 situaes, mas como tela cheia ou fragmento incorporado em outras (dependendo, talvez, 635 do tamanho da tela do dispositivo). A classe {@link android.support.v4.app.DialogFragment} 636 oferece esta flexibilidade porque ainda pode comportar-se como um {@link 637 android.support.v4.app.Fragment} incorporvel.</p> 638 639 <p>Contudo, no possvel usar {@link android.app.AlertDialog.Builder AlertDialog.Builder} 640 nem outros objetos {@link android.app.Dialog} para criar a caixa de dilogo nesse caso. Se 641 voc deseja que {@link android.support.v4.app.DialogFragment} seja 642 incorporvel, defina a IU da caixa de dilogo em um layout e carregue ou layout no retorno de chamada 643 {@link android.support.v4.app.DialogFragment#onCreateView 644 onCreateView()}.</p> 645 646 <p>A seguir h um exemplo de {@link android.support.v4.app.DialogFragment} que pode aparecer tanto como 647 caixa de dilogo quanto como fragmento incorporvel (usando um layout chamado <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>A seguir, veja alguns cdigos que decidem por exibir o fragmento como uma caixa de dilogo 675 ou como uma IU de tela cheia com base no tamanho da tela:</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>Para obter mais informaes sobre a realizao de operaes de fragmentos, consulte o guia 699 <a href="{@docRoot}guide/components/fragments.html">Fragmentos</a>.</p> 700 701 <p>Nesse exemplo, o booleano <code>mIsLargeLayout</code> especifica se o dispositivo atual 702 deve usar o projeto de layout grande do aplicativo (e, portanto, exibir esse fragmento como uma caixa de dilogo em 703 vez de tela cheia). O melhor modo de definir esse tipo de booleano declarar 704 um <a href="{@docRoot}guide/topics/resources/more-resources.html#Bool">valor de recurso bool</a> 705 com um valor de <a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">recurso alternativo</a> para diferentes tamanhos de tela. Por exemplo, a seguir h duas 706 verses de recurso bool para diferentes tamanhos de tela:</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>Assim, possvel inicializar o valor {@code mIsLargeLayout} durante o mtodo 725 {@link android.app.Activity#onCreate onCreate()} da atividade:</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">Exibio de uma atividade como uma caixa de dilogo em telas grandes</h3> 742 743 <p>Em vez de exibir uma caixa de dilogo como uma IU de tela cheia em telas pequenas, possvel obter 744 o mesmo resultado exibindo uma {@link android.app.Activity} como uma caixa de dilogo 745 em telas grandes. A abordagem escolhida depende do projeto do aplicativo, 746 mas a exibio de uma atividade como caixa de dilogo normalmente til quando o aplicativo j est projetado 747 para telas pequenas e preciso melhorar a experincia em tablets exibindo uma atividade de vida curta 748 como uma caixa de dilogo.</p> 749 750 <p>Para exibir uma atividade como uma caixa de dilogo somente em telas grandes, 751 aplique o tema {@link android.R.style#Theme_Holo_DialogWhenLarge Theme.Holo.DialogWhenLarge} 752 no elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code 753 <activity>}</a> do manifesto:</p> 754 755 <pre> 756 <activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" > 757 </pre> 758 759 <p>Para obter mais informaes sobre estilizar as atividades com temas, consulte o guia <a href="{@docRoot}guide/topics/ui/themes.html">Estilos e temas</a>.</p> 760 761 762 763 <h2 id="DismissingADialog">Dispensa de uma caixa de dilogo</h2> 764 765 <p>Quando o usurio toca em qualquer boto de ao criado 766 com um {@link android.app.AlertDialog.Builder}, o sistema dispensa a caixa de dilogo.</p> 767 768 <p>O sistema tambm dispensa a caixa de dilogo quando o usurio toca em um item em uma lista da caixa de dilogo, exceto 769 quanto a lista usa botes de opo ou caixas de seleo. Caso contrrio, possvel dispens-la manualmente 770 chamando {@link android.support.v4.app.DialogFragment#dismiss()} no {@link 771 android.support.v4.app.DialogFragment}.</p> 772 773 <p>Se for necessrio realizar determinadas 774 aes quando a caixa de dilogo dispensada, possvel implementar o mtodo {@link 775 android.support.v4.app.DialogFragment#onDismiss onDismiss()} no {@link 776 android.support.v4.app.DialogFragment}.</p> 777 778 <p>Tambm possvel <em>cancelar</em> uma caixa de dilogo. Trata-se de um evento especial que indica que o usurio 779 se retirou explicitamente da caixa de dilogo sem concluir a tarefa. Isso ocorre se o usurio pressionar o boto 780 <em>Voltar</em>, tocar na tela fora da rea da caixa de dilogo 781 ou se voc chamar {@link android.app.Dialog#cancel()} explicitamente no {@link 782 android.app.Dialog} (como em resposta a um boto "Cancelar" na caixa de dilogo).</p> 783 784 <p>Como mostrado no exemplo acima, possvel responder ao evento de cancelamento implementando 785 {@link android.support.v4.app.DialogFragment#onCancel onCancel()} na classe {@link 786 android.support.v4.app.DialogFragment}.</p> 787 788 <p class="note"><strong>Observao:</strong> o sistema chama 789 {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} para cada evento que 790 chama o retorno de chamada {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Entretanto, 791 se voc chamar {@link android.app.Dialog#dismiss Dialog.dismiss()} ou {@link 792 android.support.v4.app.DialogFragment#dismiss DialogFragment.dismiss()}, 793 o sistema chamar {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()}, <em>mas 794 no</em> {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. Portanto, geralmente, deve-se 795 chamar {@link android.support.v4.app.DialogFragment#dismiss dismiss()} quando o usurio pressiona 796 o boto <em>positivo</em> na caixa de dilogo para remov-la da vista.</p> 797 798 799