8

BottomSheetDialogFragment'un FINAL işten çıkarılmasını nasıl dinleyebilirim? iletişim üzerine (aşağı kaydırarak değil görevden alınması durumunda,BottomSheetDialogFragment - kullanıcı olayı tarafından reddedildi

Yöntem 1

Bu yalnızca yangınlar: Ben şu çalıştı

... sadece nihai görevden kullanıcı değişiklikleri kaydetmek istiyor arka basın veya dışında dokunmatik)

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

Yöntem 2

Bu

nasıl gösteren bir olay dinleyebilirsiniz

@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(); 
} 

Soru ... bana son bir işten çıkarma ve ekran döndürme veya etkinlik eğlence geliyor biri arasında ayrım izin vermez , kullanıcı diyaloğu bitirdi mi?

cevap

9

SO üzerinde tüm benzer sorular doğru çözümü aşağıdaki düşünüyorum onDismiss kullanılarak ortaya koymakla birlikte:

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

Bu DEĞİL ateşler: eğer

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

Bu yangınlar

* on screen rotation and activity recreation 

Çözüm

birleştirin onCancel

ve aşağıdaki gibi 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(); 
    } 
}