显示DialogFragment当用户点击运行权限对话框否认(Show DialogFragment

2019-11-04 03:04发布

我试图表现出DialogFragment用户点击“拒绝”上的机器人6“允许/拒绝权限”对话框后立即但是,相反,我得到这个错误:

    Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1448)
  at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1466)
  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
  at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
  at android.support.v4.app.DialogFragment.show(DialogFragment.java:139)
  at android.support.v4.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:802)
  at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
  at android.app.Activity.dispatchActivityResult(Activity.java:6432)
  at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
  at android.app.ActivityThread.-wrap16(ActivityThread.java) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:148) 
  at android.app.ActivityThread.main(ActivityThread.java:5417) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我的对话框代码是非常标准

  protected void showDialog(DialogFragment diag)
    {
        if (diag != null && !diag.isAdded())
            diag.show(getSupportFragmentManager(), "dialog");
    }

这怎么能解决?

Answer 1:

所以,有一对夫妇的解决方案,这一点,没有特别漂亮。 它的意思是,你的活动的FragmentManager还没有处于有效状态以安全的方式提交FragmentTransactions(虽然在这种特殊情况下,它应该永远是)。

1)使用.commitAllowingStateLoss()代替.show()

这是最简单的修复,虽然我不完全清楚,通过不使用出现什么分歧.show()方法,它设置一些标志内部。 似乎很好地工作。

getSupportFragmentManager()
        .beginTransaction()
        .add(diag, "dialog")
        .commitAllowingStateLoss();

1)发表的.show()作为Runnable上的Handler

// Initialize a Handler ahead of time and keep it around
private Handler mHandler = new Handler();

...

// after getting denied:
mHandler.post(new Runnable() {
    @Override
    public void run() {
        // Show your dialog
    }
}

...

@Override
protected void onStop() {
    super.onStop();

    // Clear out the Runnable for an unlikely edge case where your
    // Activity goes to stopped state before the Runnable executes
    mHandler.removeCallbacksAndMessages(null);
}

2)设置标志和显示的onResume对话框()

private boolean mPermissionDenied;

@Override
public void onRequestPermissionsResult(...) {
    // If denied...
    mPermissionDenied = true;   
}

@Override
protected void onResume() {
    super.onResume();

    if (mPermissionDenied) {
        mPermissionDenied = false;
        // Show your dialog
    }
}


Answer 2:

我也想补充一下我刚刚发现。 如果我切换getSupportFragmentManager()在我现有的代码getSupportFragmentManager().beginTransaction()它工作正常。 下面的代码

   protected void showDialog(final DialogFragment diag)
    {
        cancelDialog();
        if (diag != null && !diag.isAdded())
            diag.show(getSupportFragmentManager().beginTransaction(), "dialog");
    }

不知道为什么这个工程,我想。



Answer 3:

显示上拒绝用户点击后的对话不是指导说什么。 你应该只显示前一秒钟要求合理的权限。 你可以看看这里的自动管理: 许可库



文章来源: Show DialogFragment when user clicks deny on Runtime permissions dialog