首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >commitAllowingStateLoss on DialogFragment

commitAllowingStateLoss on DialogFragment
EN

Stack Overflow用户
提问于 2015-05-24 13:57:32
回答 3查看 12K关注 0票数 38

我有一个IllegalStateException来显示一个DialogFragment

代码语言:javascript
复制
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

我知道为什么会发生这种情况,但我想在显示对话框时使用commitAllowingStateLoss,方法是重写DialogFragment show函数:

代码语言:javascript
复制
public void show(FragmentManager manager, String tag) {
    mDismissed = false;
    mShownByMe = true;
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commit(); //replace it by commitAllowingStateLoss
}

但是我不访问mDismissedmShownByMe变量,如何像它的父变量那样访问这些变量来修改它们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-25 09:26:29

我认为,为了防止将IllegalStateException抛到DialogFragment上,最好使用:

代码语言:javascript
复制
 YourDialogFragment dialogFragment = new YourDialogFragment();
 fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment.TAG_FRAGMENT).commitAllowingStateLoss();

而不是在show()上使用DialogFragment

票数 54
EN

Stack Overflow用户

发布于 2017-08-10 19:21:01

如果您的commitAllowingStateLoss没有要保存的状态,则有关DialogFragment的解决方案可以工作,否则它们将丢失,就像函数名称所告诉的那样。但我认为,在大多数情况下,我们需要保存状态,这是DialogFragment的主要好处:安卓重新创建它并自动维护其状态。

更好的解决方案是检查重新创建的进程是否完成,如果没有,则返回给调用方,即一个活动或一个FragmentActivity,它应该调用它并在稍后的onPostResume()或onResumeFragments()回调中再次调用show函数,我们可以确保重新创建所有片段。

下面是来自DialogFragment子类的一个重写的show():

代码语言:javascript
复制
public boolean show(FragmentManager fragmentManager) {
   if (fragmentManager.isStateSaved()) return false;
   show(fragmentManager, tagName);
   return true;
}
票数 13
EN

Stack Overflow用户

发布于 2018-11-22 07:25:53

起源对话片段

代码语言:javascript
复制
public void show(FragmentManager manager, String tag) {
    mDismissed = false;
    mShownByMe = true;
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commit(); //replace it by commitAllowingStateLoss
}

我不知道mDismissedmShownByMe变量,所以如果重写DialogFragment的show(FragmentManager, String)方法,效果会更好。

代码语言:javascript
复制
override fun show(manager: FragmentManager?, tag: String?) {
    if (manager?.isDestroyed == false && !manager.isStateSaved) {
      super.show(manager, tag)
    }
  }

isStateSaved可从appcompat >= 26.0.0或androidx获得

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30424319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档