IllegalStateException - 调用 DialogFragment.show() 方法时无法在 onSaveInstanceState 之后执行此操作
IllegalStateException - Can not perform this action after onSaveInstanceState when calling DialogFragment.show() method
我正在开发一个关于如何请求 ACCESS_FINE_LOCATION 权限的 Android 6.0 应用示例,如下图所示。
选择拒绝选项时,我想向用户显示一个自定义对话框,但它抛出以下异常:
IllegalStateException - Can not perform this action after onSaveInstanceState
调用方法时抛出:
grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
在 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");
}
}
}
我想这是因为调用了 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;
}
}
关于如何解决这个问题有什么想法吗?
这是一个已知的场景,并且得到了很好的解释 here。根据那篇文章,这是造成
because you attempted to commit a FragmentTransaction after the activity’s state had been saved
您应该将 show() 对话框代码移动到 "onPostResume()" 并使用 here
中描述的标志
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;
}
我正在开发一个关于如何请求 ACCESS_FINE_LOCATION 权限的 Android 6.0 应用示例,如下图所示。
选择拒绝选项时,我想向用户显示一个自定义对话框,但它抛出以下异常:
IllegalStateException - Can not perform this action after onSaveInstanceState
调用方法时抛出:
grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
在 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");
}
}
}
我想这是因为调用了 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;
}
}
关于如何解决这个问题有什么想法吗?
这是一个已知的场景,并且得到了很好的解释 here。根据那篇文章,这是造成
because you attempted to commit a FragmentTransaction after the activity’s state had been saved
您应该将 show() 对话框代码移动到 "onPostResume()" 并使用 here
中描述的标志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;
}