BottomSheetDialogFragment - listen to dismissed by user event
Although all similar questions on SO suggest using onDismiss
I think following is the correct solution:
@Override
public void onCancel(DialogInterface dialog)
{
super.onCancel(dialog);
Toast.makeText(MainApp.get(), "CANCEL", Toast.LENGTH_SHORT).show();
}
This fires if:
* the user presses back
* the user presses outside of the dialog
This fires NOT:
* on screen rotation and activity recreation
Solution
Combine onCancel and BottomSheetBehavior.BottomSheetCallback.onStateChanged like following:
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();
}
}
If you extended from BottomSheetDialogFragment() just override in your class
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
//Code here
}
This will trigger when onBackPress and when you dismiss the dialog by clicking outside of it.
Make sure to NOT set your dialog as cancelable because this will not fire