| page.title=Creating Dialogs |
| parent.title=User Interface |
| parent.link=index.html |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>Key classes</h2> |
| <ol> |
| <li>{@link android.app.Dialog}</li> |
| </ol> |
| <h2>In this document</h2> |
| <ol> |
| <li><a href="#ShowingADialog">Showing a Dialog</a></li> |
| <li><a href="#DismissingADialog">Dismissing a Dialog</a></li> |
| <li><a href="#AlertDialog">Creating an AlertDialog</a> |
| <ol> |
| <li><a href="#AddingButtons">Adding buttons</a></li> |
| <li><a href="#AddingAList">Adding a list</a></li> |
| </ol> |
| </li> |
| <li><a href="#ProgressDialog">Creating a ProgressDialog</a> |
| <ol> |
| <li><a href="#ShowingAProgressBar">Showing a progress bar</a></li> |
| </ol> |
| </li> |
| <li><a href="#CustomDialog">Creating a Custom Dialog</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>A dialog is usually a small window that appears in front of the current Activity. |
| The underlying Activity loses focus and the dialog accepts all user interaction. |
| Dialogs are normally used |
| for notifications and short activities that directly relate to the application in progress.</p> |
| |
| <p>The Android API supports the following types of {@link android.app.Dialog} objects:</p> |
| <dl> |
| <dt>{@link android.app.AlertDialog}</dt> |
| <dd>A dialog that can manage zero, one, two, or three buttons, and/or a list of |
| selectable items that can include checkboxes or radio buttons. The AlertDialog |
| is capable of constructing most dialog user interfaces and is the suggested dialog type. |
| See <a href="#AlertDialog">Creating an AlertDialog</a> below.</dd> |
| <dt>{@link android.app.ProgressDialog}</dt> |
| <dd>A dialog that displays a progress wheel or progress bar. Because it's an extension of |
| the AlertDialog, it also supports buttons. |
| See <a href="#ProgressDialog">Creating a ProgressDialog</a> below.</dd> |
| <dt>{@link android.app.DatePickerDialog}</dt> |
| <dd>A dialog that allows the user to select a date. See the |
| <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Hello DatePicker</a> tutorial.</dd> |
| <dt>{@link android.app.TimePickerDialog}</dt> |
| <dd>A dialog that allows the user to select a time. See the |
| <a href="{@docRoot}resources/tutorials/views/hello-timepicker.html">Hello TimePicker</a> tutorial.</dd> |
| </dl> |
| |
| <p>If you would like to customize your own dialog, you can extend the |
| base {@link android.app.Dialog} object or any of the subclasses listed above and define a new layout. |
| See the section on <a href="#CustomDialog">Creating a Custom Dialog</a> below.</p> |
| |
| |
| <h2 id="ShowingADialog">Showing a Dialog</h2> |
| |
| <p>A dialog is always created and displayed as a part of an {@link android.app.Activity}. |
| You should normally create dialogs from within your Activity's |
| {@link android.app.Activity#onCreateDialog(int)} callback method. |
| When you use this callback, the Android system automatically manages the state of |
| each dialog and hooks them to the Activity, effectively making it the "owner" of each dialog. |
| As such, each dialog inherits certain properties from the Activity. For example, when a dialog |
| is open, the Menu key reveals the options menu defined for the Activity and the volume |
| keys modify the audio stream used by the Activity.</p> |
| |
| <p class="note"><strong>Note:</strong> If you decide to create a dialog outside of the |
| <code>onCreateDialog()</code> method, it will not be attached to an Activity. You can, however, |
| attach it to an Activity with {@link android.app.Dialog#setOwnerActivity(Activity)}.</p> |
| |
| <p>When you want to show a dialog, call |
| {@link android.app.Activity#showDialog(int)} and pass it an integer that uniquely identifies the |
| dialog that you want to display.</p> |
| |
| <p>When a dialog is requested for the first time, Android calls |
| {@link android.app.Activity#onCreateDialog(int)} from your Activity, which is |
| where you should instantiate the {@link android.app.Dialog}. This callback method |
| is passed the same ID that you passed to {@link android.app.Activity#showDialog(int)}. |
| After you create the Dialog, return the object at the end of the method.</p> |
| |
| <p>Before the dialog is displayed, Android also calls the optional callback method |
| {@link android.app.Activity#onPrepareDialog(int,Dialog)}. Define this method if you want to change |
| any properties of the dialog each time it is opened. This method is called |
| every time a dialog is opened, whereas {@link android.app.Activity#onCreateDialog(int)} is only |
| called the very first time a dialog is opened. If you don't define |
| {@link android.app.Activity#onPrepareDialog(int,Dialog) onPrepareDialog()}, then the dialog will |
| remain the same as it was the previous time it was opened. This method is also passed the dialog's |
| ID, along with the Dialog object you created in {@link android.app.Activity#onCreateDialog(int) |
| onCreateDialog()}.</p> |
| |
| <p>The best way to define the {@link android.app.Activity#onCreateDialog(int)} and |
| {@link android.app.Activity#onPrepareDialog(int,Dialog)} callback methods is with a |
| <em>switch</em> statement that checks the <var>id</var> parameter that's passed into the method. |
| Each <em>case</em> should check for a unique dialog ID and then create and define the respective Dialog. |
| For example, imagine a game that uses two different dialogs: one to indicate that the game |
| has paused and another to indicate that the game is over. First, define an integer ID for |
| each dialog:</p> |
| <pre> |
| static final int DIALOG_PAUSED_ID = 0; |
| static final int DIALOG_GAMEOVER_ID = 1; |
| </pre> |
| |
| <p>Then, define the {@link android.app.Activity#onCreateDialog(int)} callback with a |
| switch case for each ID:</p> |
| <pre> |
| protected Dialog onCreateDialog(int id) { |
| Dialog dialog; |
| switch(id) { |
| case DIALOG_PAUSED_ID: |
| // do the work to define the pause Dialog |
| break; |
| case DIALOG_GAMEOVER_ID: |
| // do the work to define the game over Dialog |
| break; |
| default: |
| dialog = null; |
| } |
| return dialog; |
| } |
| </pre> |
| |
| <p class="note"><strong>Note:</strong> In this example, there's no code inside |
| the case statements because the procedure for defining your Dialog is outside the scope |
| of this section. See the section below about <a href="#AlertDialog">Creating an AlertDialog</a>, |
| offers code suitable for this example.</p> |
| |
| <p>When it's time to show one of the dialogs, call {@link android.app.Activity#showDialog(int)} |
| with the ID of a dialog:</p> |
| <pre> |
| showDialog(DIALOG_PAUSED_ID); |
| </pre> |
| |
| |
| <h2 id="DismissingADialog">Dismissing a Dialog</h2> |
| |
| <p>When you're ready to close your dialog, you can dismiss it by calling |
| {@link android.app.Dialog#dismiss()} on the Dialog object. |
| If necessary, you can also call {@link android.app.Activity#dismissDialog(int)} from the |
| Activity, which effectively calls {@link android.app.Dialog#dismiss()} on the |
| Dialog for you.</p> |
| |
| <p>If you are using {@link android.app.Activity#onCreateDialog(int)} to manage the state |
| of your dialogs (as discussed in the previous section), then every time your dialog is |
| dismissed, the state of the Dialog |
| object is retained by the Activity. If you decide that you will no longer need this object or |
| it's important that the state is cleared, then you should call |
| {@link android.app.Activity#removeDialog(int)}. This will remove any internal references |
| to the object and if the dialog is showing, it will dismiss it.</p> |
| |
| <h3>Using dismiss listeners</h3> |
| |
| <p>If you'd like your applcation to perform some procedures the moment that a dialog is dismissed, |
| then you should attach an on-dismiss listener to your Dialog.</p> |
| |
| <p>First define the {@link android.content.DialogInterface.OnDismissListener} interface. |
| This interface has just one method, |
| {@link android.content.DialogInterface.OnDismissListener#onDismiss(DialogInterface)}, which |
| will be called when the dialog is dismissed. |
| Then simply pass your OnDismissListener implementation to |
| {@link android.app.Dialog#setOnDismissListener(DialogInterface.OnDismissListener) |
| setOnDismissListener()}.</p> |
| |
| <p>However, note that dialogs can also be "cancelled." This is a special case that indicates |
| the dialog was explicitly cancelled by the user. This will occur if the user presses the |
| "back" button to close the dialog, or if the dialog explicitly calls {@link android.app.Dialog#cancel()} |
| (perhaps from a "Cancel" button in the dialog). When a dialog is cancelled, |
| the OnDismissListener will still be notified, but if you'd like to be informed that the dialog |
| was explicitly cancelled (and not dismissed normally), then you should register |
| an {@link android.content.DialogInterface.OnCancelListener} with |
| {@link android.app.Dialog#setOnCancelListener(DialogInterface.OnCancelListener) |
| setOnCancelListener()}.</p> |
| |
| |
| <h2 id="AlertDialog">Creating an AlertDialog</h2> |
| |
| <p>An {@link android.app.AlertDialog} is an extension of the {@link android.app.Dialog} |
| class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. |
| You should use it for dialogs that use any of the following features:</p> |
| <ul> |
| <li>A title</li> |
| <li>A text message</li> |
| <li>One, two, or three buttons</li> |
| <li>A list of selectable items (with optional checkboxes or radio buttons)</li> |
| </ul> |
| |
| <p>To create an AlertDialog, use the {@link android.app.AlertDialog.Builder} subclass. |
| Get a Builder with {@link android.app.AlertDialog.Builder#AlertDialog.Builder(Context)} and |
| then use the class's public methods to define all of the |
| AlertDialog properties. After you're done with the Builder, retrieve the |
| AlertDialog object with {@link android.app.AlertDialog.Builder#create()}.</p> |
| |
| <p>The following topics show how to define various properties of the AlertDialog using the |
| AlertDialog.Builder class. If you use any of the following sample code inside your |
| {@link android.app.Activity#onCreateDialog(int) onCreateDialog()} callback method, |
| you can return the resulting Dialog object to display the dialog.</p> |
| |
| |
| <h3 id="AddingButtons">Adding buttons</h3> |
| |
| <img src="{@docRoot}images/dialog_buttons.png" alt="" style="float:right" /> |
| |
| <p>To create an AlertDialog with side-by-side buttons like the one shown in the screenshot to the right, |
| use the <code>set...Button()</code> methods:</p> |
| |
| <pre> |
| AlertDialog.Builder builder = new AlertDialog.Builder(this); |
| builder.setMessage("Are you sure you want to exit?") |
| .setCancelable(false) |
| .setPositiveButton("Yes", new DialogInterface.OnClickListener() { |
| public void onClick(DialogInterface dialog, int id) { |
| MyActivity.this.finish(); |
| } |
| }) |
| .setNegativeButton("No", new DialogInterface.OnClickListener() { |
| public void onClick(DialogInterface dialog, int id) { |
| dialog.cancel(); |
| } |
| }); |
| AlertDialog alert = builder.create(); |
| </pre> |
| |
| <p>First, add a message for the dialog with |
| {@link android.app.AlertDialog.Builder#setMessage(CharSequence)}. Then, begin |
| method-chaining and set the dialog |
| to be <em>not cancelable</em> (so the user cannot close the dialog with the back button) |
| with {@link android.app.AlertDialog.Builder#setCancelable(boolean)}. For each button, |
| use one of the <code>set...Button()</code> methods, such as |
| {@link android.app.AlertDialog.Builder#setPositiveButton(CharSequence,DialogInterface.OnClickListener) |
| setPositiveButton()}, that accepts the name for the button and a |
| {@link android.content.DialogInterface.OnClickListener} that defines the action to take |
| when the user selects the button.</p> |
| |
| <p class="note"><strong>Note:</strong> You can only add one of each button type to the |
| AlertDialog. That is, you cannot have more than one "positive" button. This limits the number |
| of possible buttons to three: positive, neutral, and negative. These names are technically irrelevant to the |
| actual functionality of your buttons, but should help you keep track of which one does what.</p> |
| |
| |
| <h3 id="AddingAList">Adding a list</h3> |
| |
| <img src="{@docRoot}images/dialog_list.png" alt="" style="float:right" /> |
| |
| <p>To create an AlertDialog with a list of selectable items like the one shown to the right, |
| use the <code>setItems()</code> method:</p> |
| |
| <pre> |
| final CharSequence[] items = {"Red", "Green", "Blue"}; |
| |
| AlertDialog.Builder builder = new AlertDialog.Builder(this); |
| builder.setTitle("Pick a color"); |
| builder.setItems(items, new DialogInterface.OnClickListener() { |
| public void onClick(DialogInterface dialog, int item) { |
| Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); |
| } |
| }); |
| AlertDialog alert = builder.create(); |
| </pre> |
| |
| <p>First, add a title to the dialog with |
| {@link android.app.AlertDialog.Builder#setTitle(CharSequence)}. |
| Then, add a list of selectable items with |
| {@link android.app.AlertDialog.Builder#setItems(CharSequence[],DialogInterface.OnClickListener) |
| setItems()}, which accepts the array of items to display and a |
| {@link android.content.DialogInterface.OnClickListener} that defines the action to take |
| when the user selects an item.</p> |
| |
| |
| <h4>Adding checkboxes and radio buttons</h4> |
| |
| <img src="{@docRoot}images/dialog_singlechoicelist.png" alt="" style="float:right" /> |
| |
| <p>To create a list of multiple-choice items (checkboxes) or |
| single-choice items (radio buttons) inside the dialog, use the |
| {@link android.app.AlertDialog.Builder#setMultiChoiceItems(Cursor,String,String, |
| DialogInterface.OnMultiChoiceClickListener) setMultiChoiceItems()} and |
| {@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) |
| setSingleChoiceItems()} methods, respectively. |
| If you create one of these selectable lists in the |
| {@link android.app.Activity#onCreateDialog(int) onCreateDialog()} callback method, |
| Android manages the state of the list for you. As long as the Activity is active, |
| the dialog remembers the items that were previously selected, but when the user exits the |
| Activity, the selection is lost. |
| |
| <p class="note"><strong>Note:</strong> To save the selection when the user leaves or |
| pauses the Activity, you must properly save and restore the setting throughout |
| the <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">Activity Lifecycle</a>. |
| To permanently save the selections, even when the Activity process is completely shutdown, |
| you need to save the settings |
| with one of the <a href="{@docRoot}guide/topics/data/data-storage.html">Data |
| Storage</a> techniques.</p> |
| |
| <p>To create an AlertDialog with a list of single-choice items like the one shown to the right, |
| use the same code from the previous example, but replace the <code>setItems()</code> method with |
| {@link android.app.AlertDialog.Builder#setSingleChoiceItems(int,int,DialogInterface.OnClickListener) |
| setSingleChoiceItems()}:</p> |
| |
| <pre> |
| final CharSequence[] items = {"Red", "Green", "Blue"}; |
| |
| AlertDialog.Builder builder = new AlertDialog.Builder(this); |
| builder.setTitle("Pick a color"); |
| builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { |
| public void onClick(DialogInterface dialog, int item) { |
| Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); |
| } |
| }); |
| AlertDialog alert = builder.create(); |
| </pre> |
| |
| <p>The second parameter in the |
| {@link android.app.AlertDialog.Builder#setSingleChoiceItems(CharSequence[],int,DialogInterface.OnClickListener) |
| setSingleChoiceItems()} method is an integer value for the <var>checkedItem</var>, which indicates the |
| zero-based list position of the default selected item. Use "-1" to indicate that no item should be |
| selected by default.</p> |
| |
| |
| <h2 id="ProgressDialog">Creating a ProgressDialog</h2> |
| |
| <img src="{@docRoot}images/dialog_progress_spinning.png" alt="" style="float:right" /> |
| |
| <p>A {@link android.app.ProgressDialog} is an extension of the {@link android.app.AlertDialog} |
| class that can display a progress animation in the form of a spinning wheel, for a task with |
| progress that's undefined, or a progress bar, for a task that has a defined progression. |
| The dialog can also provide buttons, such as one to cancel a download.</p> |
| |
| <p>Opening a progress dialog can be as simple as calling |
| {@link android.app.ProgressDialog#show(Context,CharSequence,CharSequence) |
| ProgressDialog.show()}. For example, the progress dialog shown to the right can be |
| easily achieved without managing the dialog through the |
| {@link android.app.Activity#onCreateDialog(int)} callback, |
| as shown here:</p> |
| |
| <pre> |
| ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", |
| "Loading. Please wait...", true); |
| </pre> |
| |
| <p>The first parameter is the application {@link android.content.Context}, |
| the second is a title for the dialog (left empty), the third is the message, |
| and the last parameter is whether the progress |
| is indeterminate (this is only relevant when creating a progress bar, which is |
| discussed in the next section). |
| </p> |
| |
| <p>The default style of a progress dialog is the spinning wheel. |
| If you want to create a progress bar that shows the loading progress with granularity, |
| some more code is required, as discussed in the next section.</p> |
| |
| |
| <h3 id="ShowingAProgressBar">Showing a progress bar</h3> |
| |
| <img src="/images/dialog_progress_bar.png" alt="" style="float:right" /> |
| |
| <p>To show the progression with an animated progress bar:</p> |
| |
| <ol> |
| <li>Initialize the |
| ProgressDialog with the class constructor, |
| {@link android.app.ProgressDialog#ProgressDialog(Context)}.</li> |
| <li>Set the progress style to "STYLE_HORIZONTAL" with |
| {@link android.app.ProgressDialog#setProgressStyle(int)} and |
| set any other properties, such as the message.</li> |
| <li>When you're ready to show the dialog, call |
| {@link android.app.Dialog#show()} or return the ProgressDialog from the |
| {@link android.app.Activity#onCreateDialog(int)} callback.</li> |
| <li>You can increment the amount of progress displayed |
| in the bar by calling either {@link android.app.ProgressDialog#setProgress(int)} with a value for |
| the total percentage completed so far or {@link android.app.ProgressDialog#incrementProgressBy(int)} |
| with an incremental value to add to the total percentage completed so far.</li> |
| </ol> |
| |
| <p>For example, your setup might look like this:</p> |
| <pre> |
| ProgressDialog progressDialog; |
| progressDialog = new ProgressDialog(mContext); |
| progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); |
| progressDialog.setMessage("Loading..."); |
| progressDialog.setCancelable(false); |
| </pre> |
| |
| <p>The setup is simple. Most of the code needed to create a progress dialog is actually |
| involved in the process that updates it. You might find that it's |
| necessary to create a second thread in your application for this work and then report the progress |
| back to the Activity's UI thread with a {@link android.os.Handler} object. |
| If you're not familiar with using additional |
| threads with a Handler, see the example Activity below that uses a second thread to |
| increment a progress dialog managed by the Activity.</p> |
| |
| <script type="text/javascript"> |
| function toggleDiv(link) { |
| var toggleable = $(link).parent(); |
| if (toggleable.hasClass("closed")) { |
| $(".toggleme", toggleable).slideDown("fast"); |
| toggleable.removeClass("closed"); |
| toggleable.addClass("open"); |
| $(".toggle-img", toggleable).attr("title", "hide").attr("src", "/assets/images/triangle-opened.png"); |
| } else { |
| $(".toggleme", toggleable).slideUp("fast"); |
| toggleable.removeClass("open"); |
| toggleable.addClass("closed"); |
| $(".toggle-img", toggleable).attr("title", "show").attr("src", "/assets/images/triangle-closed.png"); |
| } |
| return false; |
| } |
| </script> |
| <style> |
| .toggleme { |
| padding:0 0 1px 0; |
| } |
| .toggleable a { |
| text-decoration:none; |
| } |
| .toggleable.closed .toggleme { |
| display:none; |
| } |
| #jd-content .toggle-img { |
| margin:0; |
| } |
| </style> |
| |
| <div class="toggleable closed"> |
| <a href="#" onclick="return toggleDiv(this)"> |
| <img src="/assets/images/triangle-closed.png" class="toggle-img" /> |
| <strong>Example ProgressDialog with a second thread</strong></a> |
| <div class="toggleme"> |
| <p>This example uses a second thread to track the progress of a process (which actually just |
| counts up to 100). The thread sends a {@link android.os.Message} back to the main |
| Activity through a {@link android.os.Handler} each time progress is made. The main Activity then updates the |
| ProgressDialog.</p> |
| |
| <pre> |
| package com.example.progressdialog; |
| |
| import android.app.Activity; |
| import android.app.Dialog; |
| import android.app.ProgressDialog; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.view.View; |
| import android.view.View.OnClickListener; |
| import android.widget.Button; |
| |
| public class NotificationTest extends Activity { |
| static final int PROGRESS_DIALOG = 0; |
| Button button; |
| ProgressThread progressThread; |
| ProgressDialog progressDialog; |
| |
| /** Called when the activity is first created. */ |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.main); |
| |
| // Setup the button that starts the progress dialog |
| button = (Button) findViewById(R.id.progressDialog); |
| button.setOnClickListener(new OnClickListener(){ |
| public void onClick(View v) { |
| showDialog(PROGRESS_DIALOG); |
| } |
| }); |
| } |
| |
| protected Dialog onCreateDialog(int id) { |
| switch(id) { |
| case PROGRESS_DIALOG: |
| progressDialog = new ProgressDialog(NotificationTest.this); |
| progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); |
| progressDialog.setMessage("Loading..."); |
| progressThread = new ProgressThread(handler); |
| progressThread.start(); |
| return progressDialog; |
| default: |
| return null; |
| } |
| } |
| |
| // Define the Handler that receives messages from the thread and update the progress |
| final Handler handler = new Handler() { |
| public void handleMessage(Message msg) { |
| int total = msg.getData().getInt("total"); |
| progressDialog.setProgress(total); |
| if (total >= 100){ |
| dismissDialog(PROGRESS_DIALOG); |
| progressThread.setState(ProgressThread.STATE_DONE); |
| } |
| } |
| }; |
| |
| /** Nested class that performs progress calculations (counting) */ |
| private class ProgressThread extends Thread { |
| Handler mHandler; |
| final static int STATE_DONE = 0; |
| final static int STATE_RUNNING = 1; |
| int mState; |
| int total; |
| |
| ProgressThread(Handler h) { |
| mHandler = h; |
| } |
| |
| public void run() { |
| mState = STATE_RUNNING; |
| total = 0; |
| while (mState == STATE_RUNNING) { |
| try { |
| Thread.sleep(100); |
| } catch (InterruptedException e) { |
| Log.e("ERROR", "Thread Interrupted"); |
| } |
| Message msg = mHandler.obtainMessage(); |
| Bundle b = new Bundle(); |
| b.putInt("total", total); |
| msg.setData(b); |
| mHandler.sendMessage(msg); |
| total++; |
| } |
| } |
| |
| /* sets the current state for the thread, |
| * used to stop the thread */ |
| public void setState(int state) { |
| mState = state; |
| } |
| } |
| } |
| </pre> |
| </div> <!-- end toggleme --> |
| </div> <!-- end toggleable --> |
| |
| |
| |
| <h2 id="CustomDialog">Creating a Custom Dialog</h2> |
| |
| <img src="{@docRoot}images/dialog_custom.png" alt="" style="float:right" /> |
| |
| <p>If you want a customized design for a dialog, you can create your own layout |
| for the dialog window with layout and widget elements. |
| After you've defined your layout, pass the root View object or |
| layout resource ID to {@link android.app.Dialog#setContentView(View)}.</p> |
| |
| <p>For example, to create the dialog shown to the right:</p> |
| |
| <ol> |
| <li>Create an XML layout saved as <code>custom_dialog.xml</code>: |
| <pre> |
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| android:id="@+id/layout_root" |
| android:orientation="horizontal" |
| android:layout_width="fill_parent" |
| android:layout_height="fill_parent" |
| android:padding="10dp" |
| > |
| <ImageView android:id="@+id/image" |
| android:layout_width="wrap_content" |
| android:layout_height="fill_parent" |
| android:layout_marginRight="10dp" |
| /> |
| <TextView android:id="@+id/text" |
| android:layout_width="wrap_content" |
| android:layout_height="fill_parent" |
| android:textColor="#FFF" |
| /> |
| </LinearLayout> |
| </pre> |
| |
| <p>This XML defines an {@link android.widget.ImageView} and a {@link android.widget.TextView} |
| inside a {@link android.widget.LinearLayout}.</p> |
| <li>Set the above layout as the dialog's content view and define the content |
| for the ImageView and TextView elements:</p> |
| <pre> |
| Context mContext = getApplicationContext(); |
| Dialog dialog = new Dialog(mContext); |
| |
| dialog.setContentView(R.layout.custom_dialog); |
| dialog.setTitle("Custom Dialog"); |
| |
| TextView text = (TextView) dialog.findViewById(R.id.text); |
| text.setText("Hello, this is a custom dialog!"); |
| ImageView image = (ImageView) dialog.findViewById(R.id.image); |
| image.setImageResource(R.drawable.android); |
| </pre> |
| |
| <p>After you instantiate the Dialog, set your custom layout as the dialog's content view with |
| {@link android.app.Dialog#setContentView(int)}, passing it the layout resource ID. |
| Now that the Dialog has a defined layout, you can capture View objects from the layout with |
| {@link android.app.Dialog#findViewById(int)} and modify their content.</p> |
| </li> |
| |
| <li>That's it. You can now show the dialog as described in |
| <a href="#ShowingADialog">Showing A Dialog</a>.</li> |
| </ol> |
| |
| <p>A dialog made with the base Dialog class must have a title. If you don't call |
| {@link android.app.Dialog#setTitle(CharSequence) setTitle()}, then the space used for the title |
| remains empty, but still visible. If you don't want |
| a title at all, then you should create your custom dialog using the |
| {@link android.app.AlertDialog} class. However, because an AlertDialog is created easiest with |
| the {@link android.app.AlertDialog.Builder} class, you do not have access to the |
| {@link android.app.Dialog#setContentView(int)} method used above. Instead, you must use |
| {@link android.app.AlertDialog.Builder#setView(View)}. This method accepts a {@link android.view.View} object, |
| so you need to inflate the layout's root View object from |
| XML.</p> |
| |
| <p>To inflate the XML layout, retrieve the {@link android.view.LayoutInflater} with |
| {@link android.app.Activity#getLayoutInflater()} |
| (or {@link android.content.Context#getSystemService(String) getSystemService()}), |
| and then call |
| {@link android.view.LayoutInflater#inflate(int, ViewGroup)}, where the first parameter |
| is the layout resource ID and the second is the ID of the root View. At this point, you can use |
| the inflated layout to find View objects in the layout and define the content for the |
| ImageView and TextView elements. Then instantiate the AlertDialog.Builder and set the |
| inflated layout for the dialog with {@link android.app.AlertDialog.Builder#setView(View)}.</p> |
| |
| <p>Here's an example, creating a custom layout in an AlertDialog:</p> |
| |
| <pre> |
| AlertDialog.Builder builder; |
| AlertDialog alertDialog; |
| |
| Context mContext = getApplicationContext(); |
| LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); |
| View layout = inflater.inflate(R.layout.custom_dialog, |
| (ViewGroup) findViewById(R.id.layout_root)); |
| |
| TextView text = (TextView) layout.findViewById(R.id.text); |
| text.setText("Hello, this is a custom dialog!"); |
| ImageView image = (ImageView) layout.findViewById(R.id.image); |
| image.setImageResource(R.drawable.android); |
| |
| builder = new AlertDialog.Builder(mContext); |
| builder.setView(layout); |
| alertDialog = builder.create(); |
| </pre> |
| |
| <p>Using an AlertDialog for your custom layout lets you |
| take advantage of built-in AlertDialog features like managed buttons, |
| selectable lists, a title, an icon and so on.</p> |
| |
| <p>For more information, refer to the reference documentation for the |
| {@link android.app.Dialog} and {@link android.app.AlertDialog.Builder} |
| classes.</p> |
| |
| |
| |