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

हालांकि इतने पर सभी इसी तरह के सवाल onDismiss मैं निम्नलिखित लगता है कि सही समाधान उपयोग कर रहा है सुझाव देते हैं:

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

यह आग यदि:

* 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(); 
    } 
} 
संबंधित मुद्दे