DialogFragment调用show()报Can not perform this action after onSaveInstanceState的解决办法

参考文章

解决办法一

PromptDialogFragment中重写show()dismiss()方法

@Override
public void show(FragmentManager manager, String tag) {
    //super.show(manager, tag);
    try {
        Class c = Class.forName("androidx.fragment.app.DialogFragment");
        Field dismissed = c.getDeclaredField("mDismissed");
        dismissed.setAccessible(true);
        dismissed.set(obj, false);
        Field shownByMe = c.getDeclaredField("mShownByMe");
        shownByMe.setAccessible(true);
        shownByMe.set(obj, false);
    } catch (Exception e) {
        NLog.e(Constants.TAG, Log.getStackTraceString(e));
    }
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commitAllowingStateLoss();
}

@Override
public void dismiss() {
    //super.dismiss();
    dismissAllowingStateLoss();
}

解决方法二

(1)自建包androidx.fragment.app,并在包下新建类MyDialogFragment继承DialogFragment

package androidx.fragment.app;

public class MyDialogFragment extends DialogFragment {

    public boolean getDismissed() {
        return mDismissed;
    }

    public void setDismissed(boolean dismissed) {
        this.mDismissed = dismissed;
    }

    public boolean getShownByMe() {
        return mShownByMe;
    }

    public void setShownByMe(boolean shownByMe) {
        this.mShownByMe = shownByMe;
    }
}

(2)在PromptDialogFragment中重写show()dismiss()方法

public class LoginPromptDialogFragment extends MyDialogFragment

    ...

    @Override
    public void show(FragmentManager manager, String tag) {
        setDismissed(false);
        setShownByMe(false);
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commitAllowingStateLoss();
    }

    @Override
    public void dismiss() {
        //super.dismiss();
        dismissAllowingStateLoss();
    }
}
上一篇 Activity的重建(recreate)与恢复
下一篇 Android 8.0 BroadcastReceiver静态注册大部分取消,动态注册,有序广播
目录
文章列表
1 Flutter点击事件实现
Flutter点击事件实现
2
Spring Boot上传文件
Spring Boot上传文件
3
Spring Boot之Web综合开发
Spring Boot之Web综合开发
4
以太坊学习3:以太坊客户端编译安装(geth和ethereumj)
以太坊学习3:以太坊客户端编译安装(geth和ethereumj)
5
MySQL远程连接常见问题
MySQL远程连接常见问题
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。