Home | History | Annotate | Download | only in ui
      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 &mdash; inclusive
    111 layouts personalizados e outros descritos no guia de projeto <a href="{@docRoot}design/building-blocks/dialogs.html">Caixas de dilogo</a>
    112  &mdash;, 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     &#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>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 &#64;Override
    279 public Dialog onCreateDialog(Bundle savedInstanceState) {
    280     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    281     builder.setTitle(R.string.pick_color)
    282            .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
    283                public void onClick(DialogInterface dialog, int which) {
    284                // The 'which' argument contains the index position
    285                // of the selected item
    286            }
    287     });
    288     return builder.create();
    289 }
    290 </pre>
    291 
    292 <p>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 &#64;Override
    333 public Dialog onCreateDialog(Bundle savedInstanceState) {
    334     mSelectedItems = new ArrayList();  // Where we track the selected items
    335     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    336     // Set the dialog title
    337     builder.setTitle(R.string.pick_toppings)
    338     // Specify the list array, the items to be selected by default (null for none),
    339     // and the listener through which to receive callbacks when items are selected
    340            .setMultiChoiceItems(R.array.toppings, null,
    341                       new DialogInterface.OnMultiChoiceClickListener() {
    342                &#64;Override
    343                public void onClick(DialogInterface dialog, int which,
    344                        boolean isChecked) {
    345                    if (isChecked) {
    346                        // If the user checked the item, add it to the selected items
    347                        mSelectedItems.add(which);
    348                    } else if (mSelectedItems.contains(which)) {
    349                        // Else, if the item is already in the array, remove it 
    350                        mSelectedItems.remove(Integer.valueOf(which));
    351                    }
    352                }
    353            })
    354     // Set the action buttons
    355            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    356                &#64;Override
    357                public void onClick(DialogInterface dialog, int id) {
    358                    // User clicked OK, so save the mSelectedItems results somewhere
    359                    // or return them to the component that opened the dialog
    360                    ...
    361                }
    362            })
    363            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    364                &#64;Override
    365                public void onClick(DialogInterface dialog, int id) {
    366                    ...
    367                }
    368            });
    369 
    370     return builder.create();
    371 }
    372 </pre>
    373 
    374 <p>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 &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>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 &#64;Override
    454 public Dialog onCreateDialog(Bundle savedInstanceState) {
    455     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    456     // Get the layout inflater
    457     LayoutInflater inflater = getActivity().getLayoutInflater();
    458 
    459     // Inflate and set the layout for the dialog
    460     // Pass null as the parent view because its going in the dialog layout
    461     builder.setView(inflater.inflate(R.layout.dialog_signin, null))
    462     // Add action buttons
    463            .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
    464                &#64;Override
    465                public void onClick(DialogInterface dialog, int id) {
    466                    // sign in the user ...
    467                }
    468            })
    469            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    470                public void onClick(DialogInterface dialog, int id) {
    471                    LoginDialogFragment.this.getDialog().cancel();
    472                }
    473            });      
    474     return builder.create();
    475 }
    476 </pre>
    477 
    478 <div class="note">
    479 <p><strong>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 &lt;activity&gt;}</a> do manifesto:</p>
    485 
    486 <pre>
    487 &lt;activity android:theme="&#64;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     &#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>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     &#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>Como a atividade do host implementa o {@code NoticeDialogListener} &mdash; que 
    571 forado pelo mtodo de retorno de chamada {@link android.support.v4.app.Fragment#onAttach onAttach()}
    572 exibido acima &mdash;, 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     &#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">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     &#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>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 &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>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 &#64;Override
    731 public void onCreate(Bundle savedInstanceState) {
    732     super.onCreate(savedInstanceState);
    733     setContentView(R.layout.activity_main);
    734 
    735     mIsLargeLayout = getResources().getBoolean(R.bool.large_layout);
    736 }
    737 </pre>
    738 
    739 
    740 
    741 <h3 id="ActivityAsDialog">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 &lt;activity&gt;}</a> do manifesto:</p>
    754 
    755 <pre>
    756 &lt;activity android:theme="&#64;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