2016-08-26 2 views
0

У меня есть DialogFragment, который отображается, если пользователь пытается выполнить действие, для которого они ранее отказали в разрешениях.DialogFragment не отображается, если телефон не находится в ландшафте

Код DialogFragment компилируется отлично, но по причине он не отображает сообщение в диалоговом окне, если телефон не перелистал пейзаж, после чего сообщение остается.

Example of my problem

After turning the phone landscape, message displays[![][2]] 3

Вот мой диалог фрагмент кода:

public class PermissionDialog extends DialogFragment { 

    private String title; 
    private String reason; 
    PermissionListener pListener; 

    public PermissionDialog() { 
     // Required empty public constructor 

    } 

    public interface PermissionListener{ 
     //Interface listener so that activities which have dialogs can hear outcomes of events 
     void onDialogPositiveClick(DialogFragment dFragment); 
     void onDialogNegativeClick(DialogFragment dFragment); 
    } 
    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 
     //Set up the elements in the dialog including listeners 
     AlertDialog.Builder permissDialog = new AlertDialog.Builder(getActivity()); 
     if (savedInstanceState!=null){ 
      Bundle args = getArguments(); 
      title = args.getString("title",""); 
      reason = args.getString("reason",""); 
     } 
     permissDialog.setMessage(reason); 
     permissDialog.setTitle(title); 
     permissDialog.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener(){ 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // Send the positive button event back to the host activity 
       pListener.onDialogPositiveClick(PermissionDialog.this); 
      } 
     }); 
     permissDialog.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener(){ 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       pListener.onDialogNegativeClick(PermissionDialog.this); 
      } 
     }); 
     return permissDialog.create(); 
    } 

    @Override 
    public void onAttach(Activity activity){ 
     //This method will ensure the activity implements the interface for sending events 
     super.onAttach(activity); 
     try { 
      pListener = (PermissionListener) activity; 
     }catch(ClassCastException e){ 
      Toast.makeText(getActivity(), "Error in requesting permissions", Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

Это метод, в котором будет создаваться фрагмент:

private void checkStoragePermission() { 
     //This method will check whether the user has granted the permission to write their picture to external storage 
     if (Build.VERSION.SDK_INT<= Build.VERSION_CODES.LOLLIPOP_MR1){ 
      //Users device runs Lollipop or lower so we do not need to check permissions 
      savePicture(); 
     }else{ 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ 
       //Permission hasn't been granted - we should check if the user has denied this permission before 
       if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
         Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
        //Build a dialog to explain to user why permission is required 
        PermissionDialog storageDialog = new PermissionDialog(); 
        Bundle args = new Bundle(); 
        args.putString("title", "Approve Permission?"); 
        args.putString("reason", "This is required in order to write graph to external storage."); 
        storageDialog.setArguments(args); 
        storageDialog.show(getSupportFragmentManager(),"storage_dialog"); 
       }else{ 
        //Request permission 
        ActivityCompat.requestPermissions(this, 
          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_EXTERNAL_CODE); 
       } 
      }else if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) ==PackageManager.PERMISSION_GRANTED){ 
       //Permission has been granted, we can save the picture. 
       savePicture(); 
      } 
     } 
    } 

ответ

2

Я думает savedInstanceState!=null неверно. Вы намерены проверить savedInstanceState==null?

Также, я считаю, что эта проверка не требуется.

так:

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState){ 
    .... 
    AlertDialog.Builder permissDialog = new AlertDialog.Builder(getActivity()); 
    Bundle args = getArguments(); 
    permissDialog.setMessage(args.getString("reason","")); 
    permissDialog.setTitle(args.getString("title","")); 
    .... 
} 

savedInstanceState является недействительным на первый onCreateDialog вызова. Когда вы вращаете устройство, DialogFragment воссоздается ОС Android. И onCreateDialog называется savedInstanceState != null.

Here есть документ.

savedInstanceState

Bundle: Если не равно нулю, этот фрагмент быть реконструировано из предыдущего сохраненного состояния, как указано здесь.

+0

Я даже не знаю, почему ваш код работал (я не думал, что это имеет значение?), Но оно отображается правильно в первый раз, так что спасибо! – cmackie21

+0

Я добавил объяснение к моему ответу;) – nshmura

+0

Интересно! Я буду помнить в следующий раз. – cmackie21

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