diff options
| author | 2011-01-25 15:23:13 -0800 | |
|---|---|---|
| committer | 2011-01-25 15:23:13 -0800 | |
| commit | f95bd0feb57f1503be7c08083c0a4d22286256e8 (patch) | |
| tree | 7523898e898673a3d395a2b4d0dbbbb7ada02906 | |
| parent | 8fca2eccb03b9b8d71ec4a7ec088d617edec4e73 (diff) | |
| parent | f812fee071b9992872009b2dcd7969c7ce882a90 (diff) | |
Merge "Argh forget to include my final part of the change." into honeycomb
| -rw-r--r-- | core/java/android/app/Dialog.java | 27 | ||||
| -rw-r--r-- | core/java/android/app/DialogFragment.java | 12 |
2 files changed, 37 insertions, 2 deletions
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 7365670a9aaa..f4fa567e28fd 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -85,6 +85,7 @@ public class Dialog implements DialogInterface, Window.Callback, */ protected boolean mCancelable = true; + private String mCancelAndDismissTaken; private Message mCancelMessage; private Message mDismissMessage; private Message mShowMessage; @@ -1029,6 +1030,11 @@ public class Dialog implements DialogInterface, Window.Callback, * @param listener The {@link DialogInterface.OnCancelListener} to use. */ public void setOnCancelListener(final OnCancelListener listener) { + if (mCancelAndDismissTaken != null) { + throw new IllegalStateException( + "OnCancelListener is already taken by " + + mCancelAndDismissTaken + " and can not be replaced."); + } if (listener != null) { mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener); } else { @@ -1050,6 +1056,11 @@ public class Dialog implements DialogInterface, Window.Callback, * @param listener The {@link DialogInterface.OnDismissListener} to use. */ public void setOnDismissListener(final OnDismissListener listener) { + if (mCancelAndDismissTaken != null) { + throw new IllegalStateException( + "OnDismissListener is already taken by " + + mCancelAndDismissTaken + " and can not be replaced."); + } if (listener != null) { mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener); } else { @@ -1077,6 +1088,22 @@ public class Dialog implements DialogInterface, Window.Callback, mDismissMessage = msg; } + /** @hide */ + public boolean takeCancelAndDismissListeners(String msg, final OnCancelListener cancel, + final OnDismissListener dismiss) { + if (mCancelAndDismissTaken != null) { + mCancelAndDismissTaken = null; + } else if (mCancelMessage != null || mDismissMessage != null) { + return false; + } + + setOnCancelListener(cancel); + setOnDismissListener(dismiss); + mCancelAndDismissTaken = msg; + + return true; + } + /** * By default, this will use the owner Activity's suggested stream type. * diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java index 8bdd086eb466..50953d72e24f 100644 --- a/core/java/android/app/DialogFragment.java +++ b/core/java/android/app/DialogFragment.java @@ -378,6 +378,12 @@ public class DialogFragment extends Fragment * default implementation simply instantiates and returns a {@link Dialog} * class. * + * <p><em>Note: DialogFragment own the {@link Dialog#setOnCancelListener + * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener + * Dialog.setOnDismissListener} callbacks. You must not set them yourself.</em> + * To find out about these events, override {@link #onCancel(DialogInterface)} + * and {@link #onDismiss(DialogInterface)}.</p> + * * @param savedInstanceState The last saved instance state of the Fragment, * or null if this is a freshly created Fragment. * @@ -417,8 +423,10 @@ public class DialogFragment extends Fragment } mDialog.setOwnerActivity(getActivity()); mDialog.setCancelable(mCancelable); - mDialog.setOnCancelListener(this); - mDialog.setOnDismissListener(this); + if (!mDialog.takeCancelAndDismissListeners("DialogFragment", this, this)) { + throw new IllegalStateException( + "You can not set Dialog's OnCancelListener or OnDismissListener"); + } if (savedInstanceState != null) { Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG); if (dialogState != null) { |