【问题标题】:IllegalStateException while showing DialogFragment after back from AppCompatActivity从 AppCompatActivity 返回后显示 DialogFragment 时出现 IllegalStateException
【发布时间】:2016-08-28 20:20:48
【问题描述】:

我正在从自定义 DialogFragment 启动 FragmentActivity,在我返回原始 Activity 并尝试再次打开对话框后,我得到:

IllegalStateException: onSaveInstanceState 后无法执行此操作

我不明白为什么会这样,如果我从原始活动中关闭对话框,我可以根据需要再次显示它多次,但是如果我从 DialogFragment 开始一个新的活动,我无法显示再次出现任何对话框,因为我得到了异常。

这是我的代码,这个方法在我的DialogFragment中:

 public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3){
     mSearchLocationType = position;
     switch(position){
         case PSL_CURRENT_POSITION: // I can show the dialog again after this.
             break;
         case PSL_MAP_POINT:
             Intent selectMapPoint = new Intent(parentActivity, SelectMapPointActivity.class);     
             selectMapPoint.putExtra(SelectMapPointFragment.EXTRA_SELECTED_POS, mSearchLocation);
             parentActivity.startActivityForResult(selectMapPoint, REQ_MAP_POINT); 
             // After returning this Activity and trying to show ANY DialogFragment the app crashes.
             break;
         case PSL_ADDRESS:
             Intent selectAddress = new Intent(parentActivity, SelectAddressActivity.class);
             parentActivity.startActivity(selectAddress); // Also from this Activity, makes no difference.
             break;
      }
      dismiss();
 }    

我正在显示如下对话框:

if(!selectPoiAroundDialog.isVisible())
    selectPoiAroundDialog.show(parentActivity.getSupportFragmentManager(), "mSelectPoiCategoryDialog");

我已经尝试过的:

  • 重写 DialogFragment 的 show() 方法并使用此代码显示对话框:

    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commitAllowingStateLoss();

  • 调试应用程序并检查是否调用了所有生命周期方法,但对我来说似乎很正常,每次调用 DialogFragment 的 onDestroyView() 方法。

  • 重写 DialogFragment 的 show() 和 onDismiss() 方法并跟踪它是否显示。

这是一个公司应用程序,设计不佳,因此我尝试修改的类(我正在显示对话框的位置)不是 Activity 或 Fragment 的子级。 'parentActivity' 由应用程序类的静态方法访问,但我确信它具有正确的 Activity。你认为这会导致问题吗?

编辑: 完整的堆栈跟踪是在我使用 commitAllowStateLoss() 时:

 java.lang.IllegalStateException: Activity has been destroyed
 at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515)
 at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
 at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:621)
 at com.mycompany.dialog.GTDialog.show(GTDialog.java:174)
 at com.mycompany.fragment.content.SearchOfflinePOIContent$2.onClick(SearchOfflinePOIContent.java:250)
 at android.view.View.performClick(View.java:5201)
 at android.view.View$PerformClick.run(View.java:21209)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:5525)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
  • 我也尝试过覆盖onSaveInstanceState() 方法,但没有帮助。

EDIT2: 原始堆栈跟踪是:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:139)
at com.mycompany.dialog.GTDialog.show(GTDialog.java:174)
at com.mycompany.fragment.content.SearchOfflinePOIContent$1.onClick(SearchOfflinePOIContent.java:197)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21209)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

如果我重写 show() 方法并尝试使用 commitAllowingStateLoss() 提交片段,那么我会得到第一个异常。

【问题讨论】:

  • 能否请您发布完整的错误日志?
  • 您是否重写了onSaveInstanceState 方法?如果不是,则覆盖它。并且不要在onSaveInstanceState 方法上调用super()。这可能会有所帮助
  • 另外请检查这个答案:stackoverflow.com/questions/7575921/…
  • @Shoshi 我将完整的堆栈跟踪添加到问题中,我不调用 popbackstack :(。我试图覆盖 onSaveInstanceState 方法,但没有任何改变:(。
  • 您是否尝试过将parentActivity 替换为getActivity()?我的意思是selectPoiAroundDialog.show(getActivity().getSupportFragmentManager(), "mSelectPoiCategoryDialog");

标签: android android-fragments android-fragmentactivity android-dialogfragment illegalstateexception


【解决方案1】:

我发现了问题所在。当应用程序从 Activity 退出时,它并没有从 parentActivity 中删除它的引用,所以当我再次尝试显示对话框时,我给出了被破坏的 Activity 的引用。

感谢您的宝贵时间!

【讨论】:

  • 很高兴您发现了问题(y)
  • 感谢队友 :D 祝你的编程生活愉快 :D
  • 但是你是怎么解决的?
  • 我已经从 parentActivity 变量中删除了被销毁的 Activity 的引用。
猜你喜欢
  • 2023-03-18
  • 2014-10-07
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多