woyaru woyaru - 1 year ago 120
Android Question

IllegalStateException: Activity has been destroyed - when app is trying to show DialogFragment once more time

I have found a lot of similar questions on the stackoverflow but their solutions don't work in my case. They are connected with

method and the Support Library especially.

I have
which runs on one event this code:

MyDialogFragment.showMyDialog(name, this, this);

parameter is the String object. Second parameter (
) is the just
class object and the third one (also
) is the simple interface. This my
implements this interface.
is of course static method. This is it body:

MyDialogFragment fragment = new MyDialogFragment(listener, "Hello " + name);
fragment.show(activity.getFragmentManager(), "myDialog");

This is working good at the first try. But at the second I am getting this exception:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.myapp, PID: 20759
java.lang.IllegalStateException: Activity has been destroyed
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1345)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)
at android.app.BackStackRecord.commit(BackStackRecord.java:575)
at android.app.DialogFragment.show(DialogFragment.java:230)
at com.example.myapp.view.dialog.MyDialogFragment.showMyDialog(MyDialogFragment.java:41)
at com.example.myapp.MyActivity.showMyDialog(MyActivity.java:208)
at com.example.myapp.MyActivity.onEvent(MyActivity.java:232)
at com.example.myapp.MyActivity.handleMessage(MyActivity.java:89)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

In general this is the steps to reproduce my exception:

  1. Enter
    - event is received so
    is shown.

  2. Dismiss dialog by negative button.

  3. Enter
    once more time -
    is shown again.

  4. Type some code to the EditText.

  5. At this moment validation take some time. Connecting with server etc. And the negative result is returned. So it is need to show
    once more. But at this moment I am getting exception.

However, when I skip the second point and start to typing wrong code for validation,
will be shown without any issue. Strange behaviour.

I have tried with non-static method,
and also
. But there was no difference.

Answer Source

It is a bit odd - or maybe just a bug in this Android functionality. I have added block try catch to catch throwing exception in this way:

MyDialogFragment fragment = new MyDialogFragment(listener, "Hello " + name);
try {
    fragment.show(activity.getFragmentManager(), "myDialog");
} catch (Exception e) {

And of course exception is still throwing (and catching at this moment) and what is interesting my dialog fragment is recreating in correct way and user can interact with it.