FileDocCategorySizeDatePackage
Dialog.javaAPI DocAndroid 1.5 API30650Wed May 06 22:41:54 BST 2009android.app

Dialog

public class Dialog extends Object implements android.content.DialogInterface, Window.Callback, android.view.View.OnCreateContextMenuListener, KeyEvent.Callback
Base class for Dialogs.

Note: Activities provide a facility to manage the creation, saving and restoring of dialogs. See {@link Activity#onCreateDialog(int)}, {@link Activity#onPrepareDialog(int, Dialog)}, {@link Activity#showDialog(int)}, and {@link Activity#dismissDialog(int)}. If these methods are used, {@link #getOwnerActivity()} will return the Activity that managed this dialog.

Often you will want to have a Dialog display on top of the current input method, because there is no reason for it to accept text. You can do this by setting the {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} window flag (assuming your Dialog takes input focus, as it the default) with the following code:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Fields Summary
private static final String
LOG_TAG
private Activity
mOwnerActivity
final android.content.Context
mContext
final android.view.WindowManager
mWindowManager
android.view.Window
mWindow
android.view.View
mDecor
protected boolean
mCancelable
This field should be made private, so it is hidden from the SDK. {@hide}
private android.os.Message
mCancelMessage
private android.os.Message
mDismissMessage
private boolean
mCanceledOnTouchOutside
Whether to cancel the dialog when a touch is received outside of the window's bounds.
private OnKeyListener
mOnKeyListener
private boolean
mCreated
private boolean
mShowing
private final Thread
mUiThread
private final android.os.Handler
mHandler
private final Runnable
mDismissAction
private static final String
DIALOG_SHOWING_TAG
private static final String
DIALOG_HIERARCHY_TAG
private static final int
DISMISS
private static final int
CANCEL
private android.os.Handler
mDismissCancelHandler
Constructors Summary
public Dialog(android.content.Context context)
Create a Dialog window that uses the default dialog frame style.

param
context The Context the Dialog is to run it. In particular, it uses the window manager and theme in this context to present its UI.


                                                                              
       
        this(context, 0);
    
public Dialog(android.content.Context context, int theme)
Create a Dialog window that uses a custom dialog style.

param
context The Context in which the Dialog should run. In particular, it uses the window manager and theme from this context to present its UI.
param
theme A style resource describing the theme to use for the window. See Style and Theme Resources for more information about defining and using styles. This theme is applied on top of the current theme in context. If 0, the default dialog theme will be used.

        mContext = new ContextThemeWrapper(
            context, theme == 0 ? com.android.internal.R.style.Theme_Dialog : theme);
        mWindowManager = (WindowManager)context.getSystemService("window");
        Window w = PolicyManager.makeNewWindow(mContext);
        mWindow = w;
        w.setCallback(this);
        w.setWindowManager(mWindowManager, null, null);
        w.setGravity(Gravity.CENTER);
        mUiThread = Thread.currentThread();
        mDismissCancelHandler = new DismissCancelHandler(this);
    
protected Dialog(android.content.Context context, boolean cancelable, android.os.Message cancelCallback)

deprecated
hide

        this(context);
        mCancelable = cancelable;
        mCancelMessage = cancelCallback;
    
protected Dialog(android.content.Context context, boolean cancelable, OnCancelListener cancelListener)

        this(context);
        mCancelable = cancelable;
        setOnCancelListener(cancelListener);
    
Methods Summary
public voidaddContentView(android.view.View view, ViewGroup.LayoutParams params)
Add an additional content view to the screen. Added after any existing ones in the screen -- existing views are NOT removed.

param
view The desired content to display.
param
params Layout parameters for the view.

        mWindow.addContentView(view, params);
    
public voidcancel()
Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will also call your {@link DialogInterface.OnCancelListener} (if registered).

        if (mCancelMessage != null) {
            
            // Obtain a new message so this dialog can be re-used
            Message.obtain(mCancelMessage).sendToTarget();
        }
        dismiss();
    
public voidcloseOptionsMenu()

see
Activity#closeOptionsMenu()

        mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
    
public voiddismiss()
Dismiss this dialog, removing it from the screen. This method can be invoked safely from any thread. Note that you should not override this method to do cleanup when the dialog is dismissed, instead implement that in {@link #onStop}.

        if (Thread.currentThread() != mUiThread) {
            mHandler.post(mDismissAction);
        } else {
            mDismissAction.run();
        }
    
private voiddismissDialog()

        if (mDecor == null) {
            if (Config.LOGV) Log.v(LOG_TAG,
                    "[Dialog] dismiss: already dismissed, ignore");
            return;
        }
        if (!mShowing) {
            if (Config.LOGV) Log.v(LOG_TAG,
                    "[Dialog] dismiss: not showing, ignore");
            return;
        }

        mWindowManager.removeView(mDecor);
        mDecor = null;
        mWindow.closeAllPanels();
        onStop();
        mShowing = false;
        
        sendDismissMessage();
    
public booleandispatchKeyEvent(android.view.KeyEvent event)
Called to process key events. You can override this to intercept all key events before they are dispatched to the window. Be sure to call this implementation for key events that should be handled normally.

param
event The key event.
return
boolean Return true if this event was consumed.

        if ((mOnKeyListener != null) && (mOnKeyListener.onKey(this, event.getKeyCode(), event))) {
            return true;
        }
        if (mWindow.superDispatchKeyEvent(event)) {
            return true;
        }
        return event.dispatch(this);
    
voiddispatchOnCreate(android.os.Bundle savedInstanceState)

        onCreate(savedInstanceState);
        mCreated = true;
    
public booleandispatchTouchEvent(android.view.MotionEvent ev)
Called to process touch screen events. You can override this to intercept all touch screen events before they are dispatched to the window. Be sure to call this implementation for touch screen events that should be handled normally.

param
ev The touch screen event.
return
boolean Return true if this event was consumed.

        if (mWindow.superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    
public booleandispatchTrackballEvent(android.view.MotionEvent ev)
Called to process trackball events. You can override this to intercept all trackball events before they are dispatched to the window. Be sure to call this implementation for trackball events that should be handled normally.

param
ev The trackball event.
return
boolean Return true if this event was consumed.

        if (mWindow.superDispatchTrackballEvent(ev)) {
            return true;
        }
        return onTrackballEvent(ev);
    
public android.view.ViewfindViewById(int id)
Finds a view that was identified by the id attribute from the XML that was processed in {@link #onStart}.

param
id the identifier of the view to find
return
The view if found or null otherwise.

        return mWindow.findViewById(id);
    
public final android.content.ContextgetContext()
Retrieve the Context this Dialog is running in.

return
Context The Context that was supplied to the constructor.

        return mContext;
    
public android.view.ViewgetCurrentFocus()
Call {@link android.view.Window#getCurrentFocus} on the Window if this Activity to return the currently focused view.

return
View The current View with focus or null.
see
#getWindow
see
android.view.Window#getCurrentFocus

        return mWindow != null ? mWindow.getCurrentFocus() : null;
    
public android.view.LayoutInflatergetLayoutInflater()

        return getWindow().getLayoutInflater();
    
public final ActivitygetOwnerActivity()
Returns the Activity that owns this Dialog. For example, if {@link Activity#showDialog(int)} is used to show this Dialog, that Activity will be the owner (by default). Depending on how this dialog was created, this may return null.

return
The Activity that owns this Dialog.

        return mOwnerActivity;
    
public final intgetVolumeControlStream()

see
Activity#getVolumeControlStream()

        return getWindow().getVolumeControlStream();
    
public android.view.WindowgetWindow()
Retrieve the current Window for the activity. This can be used to directly access parts of the Window API that are not available through Activity/Screen.

return
Window The current window, or null if the activity is not visual.

        return mWindow;
    
public voidhide()
Hide the dialog, but do not dismiss it.

        if (mDecor != null) mDecor.setVisibility(View.GONE);
    
private booleanisOutOfBounds(android.view.MotionEvent event)

        final int x = (int) event.getX();
        final int y = (int) event.getY();
        final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
        final View decorView = getWindow().getDecorView();
        return (x < -slop) || (y < -slop)
                || (x > (decorView.getWidth()+slop))
                || (y > (decorView.getHeight()+slop));
    
public booleanisShowing()

return
Whether the dialog is currently showing.

        return mShowing;
    
public voidonContentChanged()

    
public booleanonContextItemSelected(android.view.MenuItem item)

see
Activity#onContextItemSelected(MenuItem)

        return false;
    
public voidonContextMenuClosed(android.view.Menu menu)

see
Activity#onContextMenuClosed(Menu)

    
protected voidonCreate(android.os.Bundle savedInstanceState)
Similar to {@link Activity#onCreate}, you should initialized your dialog in this method, including calling {@link #setContentView}.

param
savedInstanceState If this dialog is being reinitalized after a the hosting activity was previously shut down, holds the result from the most recent call to {@link #onSaveInstanceState}, or null if this is the first time.

    
public voidonCreateContextMenu(android.view.ContextMenu menu, android.view.View v, android.view.ContextMenu.ContextMenuInfo menuInfo)

see
Activity#onCreateContextMenu(ContextMenu, View, ContextMenuInfo)

    
public booleanonCreateOptionsMenu(android.view.Menu menu)
It is usually safe to proxy this call to the owner activity's {@link Activity#onCreateOptionsMenu(Menu)} if the client desires the same menu for this Dialog.

see
Activity#onCreateOptionsMenu(Menu)
see
#getOwnerActivity()

        return true;
    
public booleanonCreatePanelMenu(int featureId, android.view.Menu menu)

see
Activity#onCreatePanelMenu(int, Menu)

        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
            return onCreateOptionsMenu(menu);
        }
        
        return false;
    
public android.view.ViewonCreatePanelView(int featureId)

see
Activity#onCreatePanelView(int)

        return null;
    
public booleanonKeyDown(int keyCode, android.view.KeyEvent event)
A key was pressed down.

If the focused view didn't want this event, this method is called.

The default implementation handles KEYCODE_BACK to close the dialog.

see
#onKeyUp
see
android.view.KeyEvent

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mCancelable) {
                cancel();
            }
            return true;
        }

        return false;
    
public booleanonKeyMultiple(int keyCode, int repeatCount, android.view.KeyEvent event)
Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent) KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle the event).

        return false;
    
public booleanonKeyUp(int keyCode, android.view.KeyEvent event)
A key was released.

see
#onKeyDown
see
KeyEvent

        return false;
    
public booleanonMenuItemSelected(int featureId, android.view.MenuItem item)

see
Activity#onMenuItemSelected(int, MenuItem)

        return false;
    
public booleanonMenuOpened(int featureId, android.view.Menu menu)

see
Activity#onMenuOpened(int, Menu)

        return true;
    
public booleanonOptionsItemSelected(android.view.MenuItem item)

see
Activity#onOptionsItemSelected(MenuItem)

        return false;
    
public voidonOptionsMenuClosed(android.view.Menu menu)

see
Activity#onOptionsMenuClosed(Menu)

    
public voidonPanelClosed(int featureId, android.view.Menu menu)

see
Activity#onPanelClosed(int, Menu)

    
public booleanonPrepareOptionsMenu(android.view.Menu menu)
It is usually safe to proxy this call to the owner activity's {@link Activity#onPrepareOptionsMenu(Menu)} if the client desires the same menu for this Dialog.

see
Activity#onPrepareOptionsMenu(Menu)
see
#getOwnerActivity()

        return true;
    
public booleanonPreparePanel(int featureId, android.view.View view, android.view.Menu menu)

see
Activity#onPreparePanel(int, View, Menu)

        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
            boolean goforit = onPrepareOptionsMenu(menu);
            return goforit && menu.hasVisibleItems();
        }
        return true;
    
public voidonRestoreInstanceState(android.os.Bundle savedInstanceState)
Restore the state of the dialog from a previously saved bundle. The default implementation restores the state of the dialog's view hierarchy that was saved in the default implementation of {@link #onSaveInstanceState()}, so be sure to call through to super when overriding unless you want to do all restoring of state yourself.

param
savedInstanceState The state of the dialog previously saved by {@link #onSaveInstanceState()}.

        final Bundle dialogHierarchyState = savedInstanceState.getBundle(DIALOG_HIERARCHY_TAG);
        if (dialogHierarchyState == null) {
            // dialog has never been shown, or onCreated, nothing to restore.
            return;
        }
        dispatchOnCreate(savedInstanceState);
        mWindow.restoreHierarchyState(dialogHierarchyState);
        if (savedInstanceState.getBoolean(DIALOG_SHOWING_TAG)) {
            show();
        }
    
public android.os.BundleonSaveInstanceState()
Saves the state of the dialog into a bundle. The default implementation saves the state of its view hierarchy, so you'll likely want to call through to super if you override this to save additional state.

return
A bundle with the state of the dialog.


                                                      
       
        Bundle bundle = new Bundle();
        bundle.putBoolean(DIALOG_SHOWING_TAG, mShowing);
        if (mCreated) {
            bundle.putBundle(DIALOG_HIERARCHY_TAG, mWindow.saveHierarchyState());
        }
        return bundle;
    
public booleanonSearchRequested()
This hook is called when the user signals the desire to start a search.

        // not during dialogs, no.
        return false;
    
protected voidonStart()
Called when the dialog is starting.

    
protected voidonStop()
Called to tell you that you're stopping.

    
public booleanonTouchEvent(android.view.MotionEvent event)
Called when a touch screen event was not handled by any of the views under it. This is most useful to process touch events that happen outside of your window bounds, where there is no view to receive it.

param
event The touch screen event being processed.
return
Return true if you have consumed the event, false if you haven't. The default implementation will cancel the dialog when a touch happens outside of the window bounds.

        if (mCancelable && mCanceledOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN
                && isOutOfBounds(event)) {
            cancel();
            return true;
        }
        
        return false;
    
public booleanonTrackballEvent(android.view.MotionEvent event)
Called when the trackball was moved and not handled by any of the views inside of the activity. So, for example, if the trackball moves while focus is on a button, you will receive a call here because buttons do not normally do anything with trackball events. The call here happens before trackball movements are converted to DPAD key events, which then get sent back to the view hierarchy, and will be processed at the point for things like focus navigation.

param
event The trackball event being processed.
return
Return true if you have consumed the event, false if you haven't. The default implementation always returns false.

        return false;
    
public voidonWindowAttributesChanged(WindowManager.LayoutParams params)

        if (mDecor != null) {
            mWindowManager.updateViewLayout(mDecor, params);
        }
    
public voidonWindowFocusChanged(boolean hasFocus)

    
public voidopenContextMenu(android.view.View view)

see
Activity#openContextMenu(View)

        view.showContextMenu();
    
public voidopenOptionsMenu()

see
Activity#openOptionsMenu()

        mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
    
public voidregisterForContextMenu(android.view.View view)

see
Activity#registerForContextMenu(View)

        view.setOnCreateContextMenuListener(this);
    
public final booleanrequestWindowFeature(int featureId)
Enable extended window features. This is a convenience for calling {@link android.view.Window#requestFeature getWindow().requestFeature()}.

param
featureId The desired feature as defined in {@link android.view.Window}.
return
Returns true if the requested feature is supported and now enabled.
see
android.view.Window#requestFeature

        return getWindow().requestFeature(featureId);
    
private voidsendDismissMessage()

        if (mDismissMessage != null) {
            // Obtain a new message so this dialog can be re-used
            Message.obtain(mDismissMessage).sendToTarget();
        }
    
public voidsetCancelMessage(android.os.Message msg)
Set a message to be sent when the dialog is canceled.

param
msg The msg to send when the dialog is canceled.
see
#setOnCancelListener(android.content.DialogInterface.OnCancelListener)

        mCancelMessage = msg;
    
public voidsetCancelable(boolean flag)
Sets whether this dialog is cancelable with the {@link KeyEvent#KEYCODE_BACK BACK} key.

        mCancelable = flag;
    
public voidsetCanceledOnTouchOutside(boolean cancel)
Sets whether this dialog is canceled when touched outside the window's bounds. If setting to true, the dialog is set to be cancelable if not already set.

param
cancel Whether the dialog should be canceled when touched outside the window.

        if (cancel && !mCancelable) {
            mCancelable = true;
        }
        
        mCanceledOnTouchOutside = cancel;
    
public voidsetContentView(int layoutResID)
Set the screen content from a layout resource. The resource will be inflated, adding all top-level views to the screen.

param
layoutResID Resource ID to be inflated.

        mWindow.setContentView(layoutResID);
    
public voidsetContentView(android.view.View view)
Set the screen content to an explicit view. This view is placed directly into the screen's view hierarchy. It can itself be a complex view hierarhcy.

param
view The desired content to display.

        mWindow.setContentView(view);
    
public voidsetContentView(android.view.View view, ViewGroup.LayoutParams params)
Set the screen content to an explicit view. This view is placed directly into the screen's view hierarchy. It can itself be a complex view hierarhcy.

param
view The desired content to display.
param
params Layout parameters for the view.

        mWindow.setContentView(view, params);
    
public voidsetDismissMessage(android.os.Message msg)
Set a message to be sent when the dialog is dismissed.

param
msg The msg to send when the dialog is dismissed.

        mDismissMessage = msg;
    
public final voidsetFeatureDrawable(int featureId, android.graphics.drawable.Drawable drawable)
Convenience for calling {@link android.view.Window#setFeatureDrawable(int, Drawable)}.

        getWindow().setFeatureDrawable(featureId, drawable);
    
public final voidsetFeatureDrawableAlpha(int featureId, int alpha)
Convenience for calling {@link android.view.Window#setFeatureDrawableAlpha}.

        getWindow().setFeatureDrawableAlpha(featureId, alpha);
    
public final voidsetFeatureDrawableResource(int featureId, int resId)
Convenience for calling {@link android.view.Window#setFeatureDrawableResource}.

        getWindow().setFeatureDrawableResource(featureId, resId);
    
public final voidsetFeatureDrawableUri(int featureId, android.net.Uri uri)
Convenience for calling {@link android.view.Window#setFeatureDrawableUri}.

        getWindow().setFeatureDrawableUri(featureId, uri);
    
public voidsetOnCancelListener(OnCancelListener listener)
Set a listener to be invoked when the dialog is canceled.

This will only be invoked when the dialog is canceled, if the creator needs to know when it is dismissed in general, use {@link #setOnDismissListener}.

param
listener The {@link DialogInterface.OnCancelListener} to use.

        if (listener != null) {
            mCancelMessage = mDismissCancelHandler.obtainMessage(CANCEL, listener);
        } else {
            mCancelMessage = null;
        }
    
public voidsetOnDismissListener(OnDismissListener listener)
Set a listener to be invoked when the dialog is dismissed.

param
listener The {@link DialogInterface.OnDismissListener} to use.

        if (listener != null) {
            mDismissMessage = mDismissCancelHandler.obtainMessage(DISMISS, listener);
        } else {
            mDismissMessage = null;
        }
    
public voidsetOnKeyListener(OnKeyListener onKeyListener)
Sets the callback that will be called if a key is dispatched to the dialog.

        mOnKeyListener = onKeyListener;
    
public final voidsetOwnerActivity(Activity activity)
Sets the Activity that owns this dialog. An example use: This Dialog will use the suggested volume control stream of the Activity.

param
activity The Activity that owns this dialog.

        mOwnerActivity = activity;
        
        getWindow().setVolumeControlStream(mOwnerActivity.getVolumeControlStream());
    
public voidsetTitle(java.lang.CharSequence title)
Set the title text for this dialog's window.

param
title The new text to display in the title.

        mWindow.setTitle(title);
        mWindow.getAttributes().setTitle(title);
    
public voidsetTitle(int titleId)
Set the title text for this dialog's window. The text is retrieved from the resources with the supplied identifier.

param
titleId the title's text resource identifier

        setTitle(mContext.getText(titleId));
    
public final voidsetVolumeControlStream(int streamType)
By default, this will use the owner Activity's suggested stream type.

see
Activity#setVolumeControlStream(int)
see
#setOwnerActivity(Activity)

        getWindow().setVolumeControlStream(streamType);
    
public voidshow()
Start the dialog and display it on screen. The window is placed in the application layer and opaque. Note that you should not override this method to do initialization when the dialog is shown, instead implement that in {@link #onStart}.

        if (mShowing) {
            if (Config.LOGV) Log.v(LOG_TAG,
                    "[Dialog] start: already showing, ignore");
            if (mDecor != null) mDecor.setVisibility(View.VISIBLE);
            return;
        }

        if (!mCreated) {
            dispatchOnCreate(null);
        }

        onStart();
        mDecor = mWindow.getDecorView();
        WindowManager.LayoutParams l = mWindow.getAttributes();
        if ((l.softInputMode
                & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
            WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
            nl.copyFrom(l);
            nl.softInputMode |=
                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
            l = nl;
        }
        mWindowManager.addView(mDecor, l);
        mShowing = true;
    
public voidtakeKeyEvents(boolean get)
Request that key events come to this dialog. Use this if your dialog has no views with focus, but the dialog still wants a chance to process key events.

param
get true if the dialog should receive key events, false otherwise
see
android.view.Window#takeKeyEvents

        mWindow.takeKeyEvents(get);
    
public voidunregisterForContextMenu(android.view.View view)

see
Activity#unregisterForContextMenu(View)

        view.setOnCreateContextMenuListener(null);