I've got a DialogFragment that I try to create in the overridden onPostResume() method of my Activity, but I get this error message: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
I've read all the answers to similar questions (here, here, here, and the blog here), but none of them worked for me (the onPostResume fix or the Runnable fix), or aren't suitable - I don't want to use commitAllowingStateLoss because it's unsafe, and I don't want to override onSaveInstanceState without calling super().
Edit: I've narrowed down the issue to my use of Eventbus. When I create the dialog fragment directly in the onPostResume method, I don't get any errors. When I call the eventbus event to create the dialog fragment, I get the aforementioned error. I have tried changing the event handler's thread to both:
public void onEvent(DisplayOperatorDialogEvent event)
public void onEventMainThread(DisplayOperatorDialogEvent event)
but it doesn't seem to make a difference.
The code:
@Override
protected void onPostResume()
{
super.onPostResume();
Log.d("MainActivity","in onPostResume");
Intent receivedIntent = getIntent();
String receivedAction = receivedIntent.getAction();//null if started from the menu
try
{
String receivedText;
if(receivedAction!=null && receivedAction.equals("display_dialog"))
{
receivedText = receivedIntent.getStringExtra("dialog");
if(receivedText!=null && receivedText.equals("operator"))
{
String title = "hello";
String msg = "test";
DisplayOperatorDialogEvent dialogEvent = new DisplayOperatorDialogEvent(title, msg);
EventBus.getDefault().post(dialogEvent);
}
}
receivedIntent.setAction("");
receivedIntent.removeExtra("screen");
}
catch(Exception e)
{
Log.e("Error: parse the notification screen intent: ", "" + e);
}
}
public void onEvent(DisplayOperatorDialogEvent event)
{
{
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
android.support.v4.app.Fragment prev = getSupportFragmentManager().findFragmentByTag("operator");
if (prev != null)
{
ft.remove(prev);
}
ft.addToBackStack(null);
operatorDialog = new OperatorDialogFragment();
Bundle args = new Bundle();
args.putString("title", event.getTitle());
args.putString("message", event.getMsg());
operatorDialog.show(ft,"operator");
}
}
The traceback:
10-05 19:06:43.115 20803-20803/com.unifiapp E/Event﹕ Could not dispatch event: class com.unifiapp.events.Events$DisplayOperatorDialogEvent to subscribing class class com.unifiapp.MainActivity
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1360)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1378)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:155)
at com.unifiapp.MainActivity.onEvent(MainActivity.java:478)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at de.greenrobot.event.EventBus.invokeSubscriber(EventBus.java:569)
at de.greenrobot.event.EventBus.postToSubscription(EventBus.java:500)
at de.greenrobot.event.EventBus.postSingleEvent(EventBus.java:475)
at de.greenrobot.event.EventBus.post(EventBus.java:365)
at com.unifiapp.MainActivity.onPostResume(MainActivity.java:676)
at android.app.Activity.performResume(Activity.java:5323)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2764)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
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:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
This issue happens on both Android 4.0 and 4.4.