2016-08-24 56 views
1

我们使用Dialogfragment显示一些对话框,有时这些会导致“IllegalStateException:onSaveInstanceState后无法执行此操作”。Android:仍然受到'在onSaveInstanceState后无法执行此操作'的困扰

在过去,这经常发生,我可以通过编写一个DialogHelper来显示/解除对话框来减少IllegalStateException的数量。

不幸的是,有时我仍然会收到关于此问题的崩溃报告,并再次查看它,但我无法找到正确解决此问题的方法。

当前报告的崩溃正在发生onClick按钮,我们想要显示一个对话框(例如DateSliderDialog),但我无法重现崩溃:/。

mFromDateButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!isFinishing()) { 
       String title= getString(R.string.dateSliderTitle); 
       DateSliderDialog dateSliderDialog= DateSliderDialog.newInstance(title, getMinFromDate().getTimeInMillis(), getFromDateForDialog().getTimeInMillis(), DateUtils.getEndOfUniverseDate().getTime()); 
       DialogHelper.showDialog(getSupportFragmentManager(), dateSliderDialog, InquireReservationActivity.this, String.valueOf(FROM_DATE_DIALOG_ID)); 
      } 
     } 
    }); 

这就要求DialogHelper.showDialog(...)方法

public static void showDialog(FragmentManager fragmentManager, DialogFragment dialogFragment, Context context, String dialogTag) { 
    if (fragmentManager != null && dialogFragment != null && (dialogFragment.getDialog() == null || !dialogFragment.getDialog().isShowing())) { 
     if (context instanceof MyActivity) { 
      if(!((MyActivity)context).isFinishing() && ((MyActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else if (context instanceof MyListActivity) { 
      if(!((MyListActivity)context).isFinishing() && ((MyListActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else if (context instanceof MyPreferenceActivity) { 
      if(!((MyPreferenceActivity)context).isFinishing() && ((MyPreferenceActivity)context).mIsActivityRunning) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } else { 
      if(!((Activity)context).isFinishing()) { 
       dialogFragment.show(fragmentManager, dialogTag); 
      } 
     } 
    } 
} 

正如你所看到的,我已经检查:

  • 是活动结束?
  • Activity是否正在运行(通过Activity上的一个标志)?

有没有人有线索为什么这仍然发生,以及如何解决它?

感谢您的建议和答案

回答

1

每当你关闭对话框,使用

dialogFragment.dismissAllowingStateLoss(); 
+0

我解雇,但没有表现出一个dialogFragment时的时候就已经做这做那固定的所有问题。上面描述的问题只是为了显示dialogFragments,而不是解雇。 – byemute

+0

请参考以下线程:http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult – Nidhi

+0

我发布我的问题之前已经检查过一个。我看到的唯一解决方案是使用带有commitAllowingStateLoss()的FragmentTransaction,因为我的DialogFragment显示在onClick上,并且我无法控制onClick是在保存状态之前还是之后发生。除了使用dialogFragment.show()和我设置commitAllowingStateLoss()的FragmentTranscation之外,还有其他解决方案吗? – byemute

相关问题