IllegalStateException - 调用DialogFragment.show()方法后,无法在onSaveInstanceState之后执行此操作

San*_*992 1 android illegalstateexception android-dialogfragment

我正在开发一个关于如何请求ACCESS_FINE_LOCATION权限的Android 6.0应用程序示例,如下图所示.

在此输入图像描述

选择DENY选项时,我想向用户显示一个自定义对话框,但它会抛出以下异常:

IllegalStateException - Can not perform this action after onSaveInstanceState

调用方法时抛出的内容:

grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
Run Code Online (Sandbox Code Playgroud)

在onRequestPermissionsResult方法中

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == REQUEST_ACCESS_FINE_LOCATION){
        if(grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Toast.makeText(this, "Location permission granted", Toast.LENGTH_LONG).show();
        }else{
            grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这是因为对getSupportFragmentManager()方法的调用.这是我的GrantPermissionDialog代码.

public class GrantPermissionDialog extends DialogFragment {

private int statusCode;
private String message="El permiso de ubicación es necesario para que esta aplicación funcione.";
private String positiveButtonText="Salir";
private String negativeButtonText="Solicitar permiso";
public static int EXIT_APPLICATION=0;
public static int REQUEST_PERMISSION=1;

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setMessage(message);
    builder.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
                statusCode = EXIT_APPLICATION;
        }
    });
    builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            statusCode = REQUEST_PERMISSION;
        }
    });
    return builder.create();
}


public int getStatusCode() {
    return statusCode;
}
Run Code Online (Sandbox Code Playgroud)

}

关于如何解决这个问题的任何想法?

小智 5

这是一个已知的场景,这里有很好的解释.根据那篇文章,它是由它引起的

因为您在保存活动状态后尝试提交FragmentTransaction

您应该将show()对话框代码移动到"onPostResume()"并使用此处所述的标志

private boolean mRequestPermissionsWithResult = false;    

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == REQUEST_ACCESS_FINE_LOCATION){
        if(grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Toast.makeText(this, "Location permission granted", Toast.LENGTH_LONG).show();
        }else{
            mRequestPermissionsWithResult = true;
        }
    }
}

@Override
protected void onPostResume() {
    super.onPostResume();
    if (mRequestPermissionsWithResult) {
        grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
    }
    mRequestPermissionsWithResult = false;
}
Run Code Online (Sandbox Code Playgroud)