android – 调用DialogFragment的show()从onRequestPermissionsResult()导致IllegalStateException在Marshmallow

脚步:

>从Fragment或Activity请求权限
>从onRequestPermissionsResult()中显示一个DialogFragment
> java.lang.IllegalStateException抛出:无法在onSaveInstanceState之后执行此操作

这不会发生,当我显示对话框一段延迟后(使用postDelayed)。
根据http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html)在后Honeycomb设备上,我们可以在onPause()和onStop()之间提交(),没有任何STATE LOSS或EXCEPTION。
这里是一个链接到示例项目源,日志文件和问题记录。
https://drive.google.com/folderview?id=0BwvvuYbQTUl6STVSZF9TX2VUeHM&usp=sharing

我也打开了一个问题https://code.google.com/p/android/issues/detail?id=190966,但它被标记为WorkingAsIntended,他们建议只捕捉异常。但这不解决问题。我知道其他方法来解决它,但是不是这个android bug?

更新
错误的状态再次“分配”。希望它很快就会固定。
我的temp解决方案是

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // do your fragment transaction here
    }
}, 200);
该bug被接受并将被修复,但是,我强烈不同意postDelayed和定时器解决方案。执行此操作的最佳方法是在Activity中引入一个状态标志,在回调中设置它,并在onResume中使用或类似。例如:

private boolean someFlag;

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// some code checking status
    someFlag = true;
}

然后在onResume:

protected void onResume() {
    if(someFlag == true) {
        doSomething();
        someFlag = false;
    }
}
http://stackoverflow.com/questions/33264031/calling-dialogfragments-show-from-within-onrequestpermissionsresult-causes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – 调用DialogFragment的show()从onRequestPermissionsResult()导致IllegalStateException在Marshmallow