步骤:
- 向
Fragment
或Activity
请求权限
- 在
onRequestPermissionsResult()
中显示一个 DialogFragment
java.lang.IllegalStateException
is throw: Can not perform this action afteronSaveInstanceState
当我在延迟一段时间后显示对话框(使用 postDelayed)时,不会发生这种情况。
根据http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html ) 在后蜂窝设备上,我们可以在 onPause()
和 onStop()
之间 commit()
而不会出现任何状态丢失或异常。
这是示例项目源、日志文件和记录的问题的链接。
https://drive.google.com/folderview?id=0BwvvuYbQTUl6STVSZF9TX2VUeHM&usp=sharing
我还打开了一个问题 https://code.google.com/p/android/issues/detail?id=190966但它被标记为 WorkingAsIntended,他们建议只捕获异常。但这并不能解决问题。我知道其他解决方法,但这不是android bug吗?
更新 该错误的状态再次被“分配”。希望它会尽快修复。 我的临时解决方案是
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// do your fragment transaction here
}
}, 200);
最佳答案
该错误已被接受并将被修复,但是,我强烈不同意 postDelayed 和 timer 解决方案。最好的方法是在 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;
}
}
关于android - 从 onRequestPermissionsResult() 中调用 DialogFragment 的 show() 会导致 Marshmallow 中出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264031/