8

Как я могу прослушать ЗАКЛЮЧИТЕЛЬНОЕ увольнение BottomSheetDialogFragment? Я хочу, чтобы сохранить пользовательские изменения только на окончательном увольнении ...BottomSheetDialogFragment - слушать увольнение по событию пользователя

Я попробовал следующее:

Метод 1

Это срабатывает только, если диалог освобождается от ударяя его вниз (а не на назад нажмите или на сенсорный снаружи)

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
    Dialog d = super.onCreateDialog(savedInstanceState); 
    d.setOnShowListener(new DialogInterface.OnShowListener() { 
     @Override 
     public void onShow(DialogInterface dialog) { 

      BottomSheetDialog d = (BottomSheetDialog) dialog; 
      FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet); 

      BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet); 
      behaviour.setState(BottomSheetBehavior.STATE_EXPANDED); 
      behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
       @Override 
       public void onStateChanged(@NonNull View bottomSheet, int newState) { 
        if (newState == BottomSheetBehavior.STATE_HIDDEN) 
        { 
         // Bottom Sheet was dismissed by user! But this is only fired, if dialog is swiped down! Not if touch outside dismissed the dialog or the back button 
         Toast.makeText(MainApp.get(), "HIDDEN", Toast.LENGTH_SHORT).show(); 
         dismiss(); 
        } 
       } 

       @Override 
       public void onSlide(@NonNull View bottomSheet, float slideOffset) { 

       } 
      }); 
     } 
    }); 
    return d; 
} 

Метод 2

Это не позволяет мне различать окончательного увольнения и один, который идет от поворота экрана или активности отдыха ...

@Override 
public void onDismiss(DialogInterface dialog) 
{ 
    super.onDismiss(dialog); 
    // this works fine but fires one time too often for my use case, it fires on screen rotation as well, although this is a temporarily dismiss only 
    Toast.makeText(MainApp.get(), "DISMISSED", Toast.LENGTH_SHORT).show(); 
} 

Вопрос

Как я могу слушать событие, которое указывает , что пользователь завершил диалог?

ответ

9

Хотя все подобные вопросы по SO предлагают использовать onDismiss Я думаю, что следующий будет правильное решение:

@Override 
public void onCancel(DialogInterface dialog) 
{ 
    super.onCancel(dialog); 
    Toast.makeText(MainApp.get(), "CANCEL", Toast.LENGTH_SHORT).show(); 
} 

This пожары, если:

* the user presses back 
* the user presses outside of the dialog 

Это выстреливает НЕ:

* on screen rotation and activity recreation 

Решение

комбинат OnCancel и BottomSheetBehavior.BottomSheetCallback.onStateChanged как следующее:

public class Dailog extends BottomSheetDialogFragment 
{ 
    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
     super.onCancel(dialog); 
     handleUserExit(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     Dialog d = super.onCreateDialog(savedInstanceState); 
     d.setOnShowListener(new DialogInterface.OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialog) { 
       BottomSheetDialog d = (BottomSheetDialog) dialog; 
       FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet); 
       BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet); 
       behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
        @Override 
        public void onStateChanged(@NonNull View bottomSheet, int newState) { 
         if (newState == BottomSheetBehavior.STATE_HIDDEN) 
         { 
          handleUserExit(); 
          dismiss(); 
         } 
        } 

        @Override 
        public void onSlide(@NonNull View bottomSheet, float slideOffset) { 

        } 
       }); 
      } 
     }); 
     return d; 
    } 

    private void handleUserExit() 
    { 
     Toast.makeText(MainApp.get(), "TODO - SAVE data or similar", Toast.LENGTH_SHORT).show(); 
    } 
} 

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

  • Нет связанных вопросов^_^