0

Я разрабатываю пример приложения Android 6.0 о том, как запрашивать разрешение ACCESS_FINE_LOCATION, как на следующем изображении.IllegalStateException - Не удается выполнить это действие после onSaveInstanceState при вызове метода DialogFragment.show()

enter image description here

При выборе опции я хочу, чтобы показать пользователю заказной диалог ЗАПРЕТИТЬ, но он бросает следующее исключение:

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; 
} 

}

Любые идеи о том, как решить эту проблему?

+0

также добавить журнал ошибок –

ответ

3

Это известный сценарий и очень хорошо объяснен here. Согласно этой статье, это вызвано

, потому что вы пытались совершить FragmentTransaction после того, как состояние своей деятельности в спассю

Вы должны переместить шоу() диалоговый код для «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; 
} 
Смежные вопросы

 Смежные вопросы