page.title=Dialogs
page.tags="alertdialog","dialogfragment"

@jd:body



<div id="qv-wrapper">
  <div id="qv">
    <h2>In this document</h2>
<ol>
  <li><a href="#DialogFragment">Creating a Dialog Fragment</a></li>
  <li><a href="#AlertDialog">Building an Alert Dialog</a>
    <ol>
      <li><a href="#AddingButtons">Adding buttons</a></li>
      <li><a href="#AddingAList">Adding a list</a></li>
      <li><a href="#CustomLayout">Creating a Custom Layout</a></li>
    </ol>
  </li>
  <li><a href="#PassingEvents">Passing Events Back to the Dialog's Host</a></li>
  <li><a href="#ShowingADialog">Showing a Dialog</a></li>
  <li><a href="#FullscreenDialog">Showing a Dialog Fullscreen or as an Embedded Fragment</a>
    <ol>
      <li><a href="#ActivityAsDialog">Showing an activity as a dialog on large screens</a></li>
    </ol>
  </li>
  <li><a href="#DismissingADialog">Dismissing a Dialog</a></li>
</ol>

    <h2>Key classes</h2>
    <ol>
      <li>{@link android.app.DialogFragment}</li>
      <li>{@link android.app.AlertDialog}</li>
    </ol>
    
    <h2>See also</h2>
    <ol>
      <li><a href="{@docRoot}design/building-blocks/dialogs.html">Dialogs design guide</a></li>
      <li><a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> (Date/Time dialogs)</li>
    </ol>
  </div>
</div>

<p>A dialog is a small window that prompts the user to
make a decision or enter additional information. A dialog does not fill the screen and is
normally used for modal events that require users to take an action before they can proceed.</p>

<div class="note design">
<p><strong>Dialog Design</strong></p>
  <p>For information about how to design your dialogs, including recommendations
  for language, read the <a
href="{@docRoot}design/building-blocks/dialogs.html">Dialogs</a> design guide.</p>
</div>

<img src="{@docRoot}images/ui/dialogs.png" />

<p>The {@link android.app.Dialog} class is the base class for dialogs, but you
should avoid instantiating {@link android.app.Dialog} directly.
Instead, use one of the following subclasses:</p>
<dl>
  <dt>{@link android.app.AlertDialog}</dt>
  <dd>A dialog that can show a title, up to three buttons, a list of
    selectable items, or a custom layout.</dd>
  <dt>{@link android.app.DatePickerDialog} or {@link android.app.TimePickerDialog}</dt>
  <dd>A dialog with a pre-defined UI that allows the user to select a date or time.</dd>
</dl>

<div class="sidebox">
<h2>Avoid ProgressDialog</h2>
<p>Android includes another dialog class called
{@link android.app.ProgressDialog} that shows a dialog with a progress bar. However, if you
need to indicate loading or indeterminate progress, you should instead follow the design
guidelines for <a href="{@docRoot}design/building-blocks/progress.html">Progress &amp;
Activity</a> and use a {@link android.widget.ProgressBar} in your layout.</p>
</div>

<p>These classes define the style and structure for your dialog, but you should
use a {@link android.support.v4.app.DialogFragment} as a container for your dialog.
The {@link android.support.v4.app.DialogFragment} class provides all the controls you
need to create your dialog and manage its appearance, instead of calling methods
on the {@link android.app.Dialog} object.</p>

<p>Using {@link android.support.v4.app.DialogFragment} to manage the dialog
ensures that it correctly handles lifecycle events
such as when the user presses the <em>Back</em> button or rotates the screen. The {@link
android.support.v4.app.DialogFragment} class also allows you to reuse the dialog's UI as an
embeddable component in a larger UI, just like a traditional {@link
android.support.v4.app.Fragment} (such as when you want the dialog UI to appear differently
on large and small screens).</p>

<p>The following sections in this guide describe how to use a {@link
android.support.v4.app.DialogFragment} in combination with an {@link android.app.AlertDialog}
object. If you'd like to create a date or time picker, you should instead read the
<a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> guide.</p>

<p class="note"><strong>Note:</strong>
Because the {@link android.app.DialogFragment} class was originally added with
Android 3.0 (API level 11), this document describes how to use the {@link
android.support.v4.app.DialogFragment} class that's provided with the <a
href="{@docRoot}tools/support-library/index.html">Support Library</a>. By adding this library
to your app, you can use {@link android.support.v4.app.DialogFragment} and a variety of other
APIs on devices running Android 1.6 or higher. If the minimum version your app supports
is API level 11 or higher, then you can use the framework version of {@link
android.app.DialogFragment}, but be aware that the links in this document are for the support
library APIs. When using the support library,
be sure that you import <code>android.support.v4.app.DialogFragment</code>
class and <em>not</em> <code>android.app.DialogFragment</code>.</p>


<h2 id="DialogFragment">Creating a Dialog Fragment</h2>

<p>You can accomplish a wide variety of dialog designs&mdash;including
custom layouts and those described in the <a
href="{@docRoot}design/building-blocks/dialogs.html">Dialogs</a>
design guide&mdash;by extending
{@link android.support.v4.app.DialogFragment} and creating a {@link android.app.AlertDialog}
in the {@link android.support.v4.app.DialogFragment#onCreateDialog
onCreateDialog()} callback method.</p>

<p>For example, here's a basic {@link android.app.AlertDialog} that's managed within
a {@link android.support.v4.app.DialogFragment}:</p>

<pre>
public class FireMissilesDialogFragment extends DialogFragment {
    &#64;Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_fire_missiles)
               .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // FIRE ZE MISSILES!
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancelled the dialog
                   }
               });
        // Create the AlertDialog object and return it
        return builder.create();
    }
}
</pre>

<div class="figure" style="width:290px;margin:0 0 0 20px">
<img src="{@docRoot}images/ui/dialog_buttons.png" alt="" />
<p class="img-caption"><strong>Figure 1.</strong>
A dialog with a message and two action buttons.</p>
</div>

<p>Now, when you create an instance of this class and call {@link
android.support.v4.app.DialogFragment#show show()} on that object, the dialog appears as
shown in figure 1.</p>

<p>The next section describes more about using the {@link android.app.AlertDialog.Builder}
APIs to create the dialog.</p>

<p>Depending on how complex your dialog is, you can implement a variety of other callback
methods in the {@link android.support.v4.app.DialogFragment}, including all the basic
<a href="{@docRoot}guide/components/fragments.html#Lifecycle">fragment lifecycle methods</a>.





<h2 id="AlertDialog">Building an Alert Dialog</h2>


<p>The {@link android.app.AlertDialog} class allows you to build a variety of dialog designs and
is often the only dialog class you'll need.
As shown in figure 2, there are three regions of an alert dialog:</p>

<div class="figure" style="width:311px;margin-top:0">
<img src="{@docRoot}images/ui/dialogs_regions.png" alt="" style="margin-bottom:0"/>
<p class="img-caption"><strong>Figure 2.</strong> The layout of a dialog.</p>
</div>

<ol>
<li><b>Title</b>
  <p>This is optional and should be used only when the content area
  is occupied by a detailed message, a list, or custom layout. If you need to state
  a simple message or question (such as the dialog in figure 1), you don't need a title.</li>
<li><b>Content area</b>
  <p>This can display a message, a list, or other custom layout.</p></li>
<li><b>Action buttons</b>
  <p>There should be no more than three action buttons in a dialog.</p></li>
</ol>

<p>The {@link android.app.AlertDialog.Builder}
class provides APIs that allow you to create an {@link android.app.AlertDialog}
with these kinds of content, including a custom layout.</p>

<p>To build an {@link android.app.AlertDialog}:</p>

<pre>
<b>// 1. Instantiate an {@link android.app.AlertDialog.Builder} with its constructor</b>
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

<b>// 2. Chain together various setter methods to set the dialog characteristics</b>
builder.setMessage(R.string.dialog_message)
       .setTitle(R.string.dialog_title);

<b>// 3. Get the {@link android.app.AlertDialog} from {@link android.app.AlertDialog.Builder#create()}</b>
AlertDialog dialog = builder.create();
</pre>

<p>The following topics show how to define various dialog attributes using the
{@link android.app.AlertDialog.Builder} class.</p>




<h3 id="AddingButtons">Adding buttons</h3>

<p>To add action buttons like those in figure 2,
call the {@link android.app.AlertDialog.Builder#setPositiveButton setPositiveButton()} and
{@link android.app.AlertDialog.Builder#setNegativeButton setNegativeButton()} methods:</p>

<pre style="clear:right">
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Add the buttons
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User clicked OK button
           }
       });
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // User cancelled the dialog
           }
       });
// Set other dialog properties
...

// Create the AlertDialog
AlertDialog dialog = builder.create();
</pre>

<p>The <code>set...Button()</code> methods require a title for the button (supplied
by a <a href="{@docRoot}guide/topics/resources/string-resource.html">string resource</a>) and a 
{@link android.content.DialogInterface.OnClickListener} that defines the action to take 
when the user presses the button.</p>

<p>There are three different action buttons you can add:</p>
<dl>
  <dt>Positive</dt>
  <dd>You should use this to accept and continue with the action (the "OK" action).</dd>
  <dt>Negative</dt>
  <dd>You should use this to cancel the action.</dd>
  <dt>Neutral</dt>
  <dd>You should use this when the user may not want to proceed with the action,
  but doesn't necessarily want to cancel. It appears between the positive and negative
  buttons. For example, the action might be "Remind me later."</dd> 
</dl>

<p>You can add only one of each button type to an {@link
android.app.AlertDialog}. That is, you cannot have more than one "positive" button.</p>



<div class="figure" style="width:290px;margin:0 0 0 40px">
<img src="{@docRoot}images/ui/dialog_list.png" alt="" />
<p class="img-caption"><strong>Figure 3.</strong>
A dialog with a title and list.</p>
</div>

<h3 id="AddingAList">Adding a list</h3>

<p>There are three kinds of lists available with the {@link android.app.AlertDialog} APIs:</p>
<ul>
<li>A traditional single-choice list</li>
<li>A persistent single-choice list (radio buttons)</li>
<li>A persistent multiple-choice list (checkboxes)</li>
</ul>

<p>To create a single-choice list like the one in figure 3, 
use the {@link android.app.AlertDialog.Builder#setItems setItems()} method:</p>

<pre style="clear:right">
&#64;Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.pick_color);
           .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
               // The 'which' argument contains the index position
               // of the selected item
           }
    });
    return builder.create();
}
</pre>

<p>Because the list appears in the dialog's content area,
the dialog cannot show both a message and a list and you should set a title for the
dialog with {@link android.app.AlertDialog.Builder#setTitle setTitle()}. 
To specify the items for the list, call {@link
android.app.AlertDialog.Builder#setItems setItems()}, passing an array.
Alternatively, you can specify a list using {@link
android.app.AlertDialog.Builder#setAdapter setAdapter()}. This allows you to back the list
with dynamic data (such as from a database) using a {@link android.widget.ListAdapter}.</p>

<p>If you choose to back your list with a {@link android.widget.ListAdapter},
always use a {@link android.support.v4.content.Loader} so that the content loads
asynchronously. This is described further in
<a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">Building Layouts
with an Adapter</a> and the <a href="{@docRoot}guide/components/loaders.html">Loaders</a>
guide.</p>

<p class="note"><strong>Note:</strong> By default, touching a list item dismisses the dialog,
unless you're using one of the following persistent choice lists.</p>

<div class="figure" style="width:290px;margin:-30px 0 0 40px">
<img src="{@docRoot}images/ui/dialog_checkboxes.png" />
<p class="img-caption"><strong>Figure 4.</strong>
A list of multiple-choice items.</p>
</div>


<h4 id="Checkboxes">Adding a persistent multiple-choice or single-choice list</h4>

<p>To add a list of multiple-choice items (checkboxes) or 
single-choice items (radio buttons), use the
{@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String,
DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()} or 
{@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 
setSingleChoiceItems()} methods, respectively.</p>

<p>For example, here's how you can create a multiple-choice list like the
one shown in figure 4 that saves the selected
items in an {@link java.util.ArrayList}:</p>

<pre style="clear:right">
&#64;Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    mSelectedItems = new ArrayList();  // Where we track the selected items
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Set the dialog title
    builder.setTitle(R.string.pick_toppings)
    // Specify the list array, the items to be selected by default (null for none),
    // and the listener through which to receive callbacks when items are selected
           .setMultiChoiceItems(R.array.toppings, null,
                      new DialogInterface.OnMultiChoiceClickListener() {
               &#64;Override
               public void onClick(DialogInterface dialog, int which,
                       boolean isChecked) {
                   if (isChecked) {
                       // If the user checked the item, add it to the selected items
                       mSelectedItems.add(which);
                   } else if (mSelectedItems.contains(which)) {
                       // Else, if the item is already in the array, remove it 
                       mSelectedItems.remove(Integer.valueOf(which));
                   }
               }
           })
    // Set the action buttons
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               &#64;Override
               public void onClick(DialogInterface dialog, int id) {
                   // User clicked OK, so save the mSelectedItems results somewhere
                   // or return them to the component that opened the dialog
                   ...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               &#64;Override
               public void onClick(DialogInterface dialog, int id) {
                   ...
               }
           });

    return builder.create();
}
</pre>

<p>Although both a traditional list and a list with radio buttons
provide a "single choice" action, you should use {@link
android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) 
setSingleChoiceItems()} if you want to persist the user's choice.
That is, if opening the dialog again later should indicate what the user's current choice is,
then you create a list with radio buttons.</p>





<h3 id="CustomLayout">Creating a Custom Layout</h3>

<div class="figure" style="width:290px;margin:-30px 0 0 40px">
<img src="{@docRoot}images/ui/dialog_custom.png" alt="" />
<p class="img-caption"><strong>Figure 5.</strong> A custom dialog layout.</p>
</div>

<p>If you want a custom layout in a dialog, create a layout and add it to an
{@link android.app.AlertDialog} by calling {@link
android.app.AlertDialog.Builder#setView setView()} on your {@link
android.app.AlertDialog.Builder} object.</p>

<p>By default, the custom layout fills the dialog window, but you can still
use {@link android.app.AlertDialog.Builder} methods to add buttons and a title.</p>

<p>For example, here's the layout file for the dialog in Figure 5:</p>

<p style="clear:right" class="code-caption">res/layout/dialog_signin.xml</p>
<pre>
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    &lt;ImageView
        android:src="@drawable/header_logo"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:scaleType="center"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name" />
    &lt;EditText
        android:id="@+id/username"
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:hint="@string/username" />
    &lt;EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:fontFamily="sans-serif"
        android:hint="@string/password"/>
&lt;/LinearLayout>
</pre>

<p class="note"><strong>Tip:</strong> By default, when you set an {@link android.widget.EditText}
element to use the {@code "textPassword"} input type, the font family is set to monospace, so
you should change its font family to {@code "sans-serif"} so that both text fields use
a matching font style.</p>

<p>To inflate the layout in your {@link android.support.v4.app.DialogFragment},
get a {@link android.view.LayoutInflater} with 
{@link android.app.Activity#getLayoutInflater()} and call
{@link android.view.LayoutInflater#inflate inflate()}, where the first parameter
is the layout resource ID and the second parameter is a parent view for the layout.
You can then call {@link android.app.AlertDialog#setView setView()}
to place the layout in the dialog.</p>

<pre>
&#64;Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
    // Add action buttons
           .setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
               &#64;Override
               public void onClick(DialogInterface dialog, int id) {
                   // sign in the user ...
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   LoginDialogFragment.this.getDialog().cancel();
               }
           });      
    return builder.create();
}
</pre>

<div class="note">
<p><strong>Tip:</strong> If you want a custom dialog,
you can instead display an {@link android.app.Activity} as a dialog
instead of using the {@link android.app.Dialog} APIs. Simply create an activity and set its theme to
{@link android.R.style#Theme_Holo_Dialog Theme.Holo.Dialog}
in the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
&lt;activity&gt;}</a> manifest element:</p>

<pre>
&lt;activity android:theme="&#64;android:style/Theme.Holo.Dialog" >
</pre>
<p>That's it. The activity now displays in a dialog window instead of fullscreen.</p>
</div>



<h2 id="PassingEvents">Passing Events Back to the Dialog's Host</h2>

<p>When the user touches one of the dialog's action buttons or selects an item from its list,
your {@link android.support.v4.app.DialogFragment} might perform the necessary
action itself, but often you'll want to deliver the event to the activity or fragment that
opened the dialog. To do this, define an interface with a method for each type of click event.
Then implement that interface in the host component that will
receive the action events from the dialog.</p>

<p>For example, here's a {@link android.support.v4.app.DialogFragment} that defines an
interface through which it delivers the events back to the host activity:</p>

<pre>
public class NoticeDialogFragment extends DialogFragment {
    
    /* The activity that creates an instance of this dialog fragment must
     * implement this interface in order to receive event callbacks.
     * Each method passes the DialogFragment in case the host needs to query it. */
    public interface NoticeDialogListener {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }
    
    // Use this instance of the interface to deliver action events
    NoticeDialogListener mListener;
    
    // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
    &#64;Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // Verify that the host activity implements the callback interface
        try {
            // Instantiate the NoticeDialogListener so we can send events to the host
            mListener = (NoticeDialogListener) activity;
        } catch (ClassCastException e) {
            // The activity doesn't implement the interface, throw exception
            throw new ClassCastException(activity.toString()
                    + " must implement NoticeDialogListener");
        }
    }
    ...
}
</pre>

<p>The activity hosting the dialog creates an instance of the dialog
with the dialog fragment's constructor and receives the dialog's
events through an implementation of the {@code NoticeDialogListener} interface:</p>

<pre>
public class MainActivity extends FragmentActivity
                          implements NoticeDialogFragment.NoticeDialogListener{
    ...
    
    public void showNoticeDialog() {
        // Create an instance of the dialog fragment and show it
        DialogFragment dialog = new NoticeDialogFragment();
        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following methods
    // defined by the NoticeDialogFragment.NoticeDialogListener interface
    &#64;Override
    public void onDialogPositiveClick(DialogFragment dialog) {
        // User touched the dialog's positive button
        ...
    }

    &#64;Override
    public void onDialogNegativeClick(DialogFragment dialog) {
        // User touched the dialog's negative button
        ...
    }
}
</pre>

<p>Because the host activity implements the {@code NoticeDialogListener}&mdash;which is
enforced by the {@link android.support.v4.app.Fragment#onAttach onAttach()}
callback method shown above&mdash;the dialog fragment can use the
interface callback methods to deliver click events to the activity:</p>

<pre>
public class NoticeDialogFragment extends DialogFragment {
    ...

    &#64;Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Build the dialog and set up the button click handlers
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_fire_missiles)
               .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the positive button event back to the host activity
                       mListener.onDialogPositiveClick(NoticeDialogFragment.this);
                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // Send the negative button event back to the host activity
                       mListener.onDialogNegativeClick(NoticeDialogFragment.this);
                   }
               });
        return builder.create();
    }
}
</pre>



<h2 id="ShowingADialog">Showing a Dialog</h2>

<p>When you want to show your dialog, create an instance of your {@link
android.support.v4.app.DialogFragment} and call {@link android.support.v4.app.DialogFragment#show
show()}, passing the {@link android.support.v4.app.FragmentManager} and a tag name
for the dialog fragment.</p>

<p>You can get the {@link android.support.v4.app.FragmentManager} by calling
{@link android.support.v4.app.FragmentActivity#getSupportFragmentManager()} from
the {@link android.support.v4.app.FragmentActivity} or {@link
android.support.v4.app.Fragment#getFragmentManager()} from a {@link
android.support.v4.app.Fragment}. For example:</p>

<pre>
public void confirmFireMissiles() {
    DialogFragment newFragment = new FireMissilesDialogFragment();
    newFragment.show(getSupportFragmentManager(), "missiles");
}
</pre>

<p>The second argument, {@code "missiles"}, is a unique tag name that the system uses to save
and restore the fragment state when necessary. The tag also allows you to get a handle to
the fragment by calling {@link android.support.v4.app.FragmentManager#findFragmentByTag
findFragmentByTag()}.</p>




<h2 id="FullscreenDialog">Showing a Dialog Fullscreen or as an Embedded Fragment</h2>

<p>You might have a UI design in which you want a piece of the UI to appear as a dialog in some
situations, but as a full screen or embedded fragment in others (perhaps depending on whether
the device is a large screen or small screen). The {@link android.support.v4.app.DialogFragment}
class offers you this flexibility because it can still behave as an embeddable {@link
android.support.v4.app.Fragment}.</p>

<p>However, you cannot use {@link android.app.AlertDialog.Builder AlertDialog.Builder}
or other {@link android.app.Dialog} objects to build the dialog in this case. If
you want the {@link android.support.v4.app.DialogFragment} to be
embeddable, you must define the dialog's UI in a layout, then load the layout in the
{@link android.support.v4.app.DialogFragment#onCreateView
onCreateView()} callback.</p>

<p>Here's an example {@link android.support.v4.app.DialogFragment} that can appear as either a
dialog or an embeddable fragment (using a layout named <code>purchase_items.xml</code>):</p>

<pre>
public class CustomDialogFragment extends DialogFragment {
    /** The system calls this to get the DialogFragment's layout, regardless
        of whether it's being displayed as a dialog or an embedded fragment. */
    &#64;Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout to use as dialog or embedded fragment
        return inflater.inflate(R.layout.purchase_items, container, false);
    }
  
    /** The system calls this only when creating the layout in a dialog. */
    &#64;Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
}
</pre>

<p>And here's some code that decides whether to show the fragment as a dialog
or a fullscreen UI, based on the screen size:</p>

<pre>
public void showDialog() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    CustomDialogFragment newFragment = new CustomDialogFragment();
    
    if (mIsLargeLayout) {
        // The device is using a large layout, so show the fragment as a dialog
        newFragment.show(fragmentManager, "dialog");
    } else {
        // The device is smaller, so show the fragment fullscreen
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        // For a little polish, specify a transition animation
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        // To make it fullscreen, use the 'content' root view as the container
        // for the fragment, which is always the root view for the activity
        transaction.add(android.R.id.content, newFragment)
                   .addToBackStack(null).commit();
    }
}
</pre>

<p>For more information about performing fragment transactions, see the
<a href="{@docRoot}guide/components/fragments.html">Fragments</a> guide.</p>

<p>In this example, the <code>mIsLargeLayout</code> boolean specifies whether the current device
should use the app's large layout design (and thus show this fragment as a dialog, rather
than fullscreen). The best way to set this kind of boolean is to declare a
<a href="{@docRoot}guide/topics/resources/more-resources.html#Bool">bool resource value</a>
with an <a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources"
>alternative resource</a> value for different screen sizes. For example, here are two
versions of the bool resource for different screen sizes:</p>

<p class="code-caption">res/values/bools.xml</p>
<pre>
&lt;!-- Default boolean values -->
&lt;resources>
    &lt;bool name="large_layout">false&lt;/bool>
&lt;/resources>
</pre>

<p class="code-caption">res/values-large/bools.xml</p>
<pre>
&lt;!-- Large screen boolean values -->
&lt;resources>
    &lt;bool name="large_layout">true&lt;/bool>
&lt;/resources>
</pre>

<p>Then you can initialize the {@code mIsLargeLayout} value during the activity's
{@link android.app.Activity#onCreate onCreate()} method:</p>

<pre>
boolean mIsLargeLayout;

&#64;Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mIsLargeLayout = getResources().getBoolean(R.bool.large_layout);
}
</pre>



<h3 id="ActivityAsDialog">Showing an activity as a dialog on large screens</h3>

<p>Instead of showing a dialog as a fullscreen UI when on small screens, you can accomplish
the same result by showing an {@link android.app.Activity} as a dialog when on
large screens. Which approach you choose depends on your app design, but
showing an activity as a dialog is often useful when your app is already designed for small
screens and you'd like to improve the experience on tablets by showing a short-lived activity
as a dialog.</p>

<p>To show an activity as a dialog only when on large screens,
apply the {@link android.R.style#Theme_Holo_DialogWhenLarge Theme.Holo.DialogWhenLarge}
theme to the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
&lt;activity&gt;}</a> manifest element:</p>

<pre>
&lt;activity android:theme="&#64;android:style/Theme.Holo.DialogWhenLarge" >
</pre>

<p>For more information about styling your activities with themes, see the <a
href="{@docRoot}guide/topics/ui/themes.html">Styles and Themes</a> guide.</p>



<h2 id="DismissingADialog">Dismissing a Dialog</h2>

<p>When the user touches any of the action buttons created with an
{@link android.app.AlertDialog.Builder}, the system dismisses the dialog for you.</p>

<p>The system also dismisses the dialog when the user touches an item in a dialog list, except
when the list uses radio buttons or checkboxes. Otherwise, you can manually dismiss your dialog
by calling {@link android.support.v4.app.DialogFragment#dismiss()} on your {@link
android.support.v4.app.DialogFragment}.</p>

<p>In case you need to perform certain
actions when the dialog goes away, you can implement the {@link
android.support.v4.app.DialogFragment#onDismiss onDismiss()} method in your {@link
android.support.v4.app.DialogFragment}.</p>

<p>You can also <em>cancel</em> a dialog. This is a special event that indicates the user
explicitly left the dialog without completing the task. This occurs if the user presses the 
<em>Back</em> button, touches the screen outside the dialog area,
or if you explicitly call {@link android.app.Dialog#cancel()} on the {@link
android.app.Dialog} (such as in response to a "Cancel" button in the dialog).</p>

<p>As shown in the example above, you can respond to the cancel event by implementing
{@link android.support.v4.app.DialogFragment#onCancel onCancel()} in your {@link
android.support.v4.app.DialogFragment} class.</p>

<p class="note"><strong>Note:</strong> The system calls
{@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} upon each event that
invokes the {@link android.support.v4.app.DialogFragment#onCancel onCancel()} callback. However,
if you call {@link android.app.Dialog#dismiss Dialog.dismiss()} or {@link
android.support.v4.app.DialogFragment#dismiss DialogFragment.dismiss()},
the system calls {@link android.support.v4.app.DialogFragment#onDismiss onDismiss()} <em>but
not</em> {@link android.support.v4.app.DialogFragment#onCancel onCancel()}. So you should generally
call {@link android.support.v4.app.DialogFragment#dismiss dismiss()} when the user presses the
<em>positive</em> button in your dialog in order to remove the dialog from view.</p>


