J'ai implémenté une boîte de dialogue BottomSheet et je souhaite empêcher la fermeture de la feuille de fond lorsque l'utilisateur touche à l'extérieur de la feuille de fond quand elle jette un œil (état non entièrement développé).
J'ai mis dialog.setCanceledOnTouchOutside(false);
dans le code mais cela ne semble pas avoir d'effet.
Voici ma classe BottomSheetDialogFragment:
public class ShoppingCartBottomSheetFragment extends BottomSheetDialogFragment {
private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
};
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
View contentView = View.inflate(getContext(), R.layout.fragment_shopping_cart_bottom_sheet, null);
dialog.setCanceledOnTouchOutside(false);
dialog.setContentView(contentView);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = params.getBehavior();
if( behavior != null && behavior instanceof BottomSheetBehavior ) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
((BottomSheetBehavior) behavior).setPeekHeight(97);
((BottomSheetBehavior) behavior).setHideable(false);
}
}
@Override
public void onStart() {
super.onStart();
Window window = getDialog().getWindow();
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.dimAmount = 0;
windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(windowParams);
}
}
Selon la feuille inférieure spécification les feuilles inférieures peuvent être ignorées en touchant l'extérieur de la feuille inférieure, donc quelles sont mes options pour remplacer ce comportement et empêcher qu'il soit rejeté?
Vous devez utiliser #setCancelable(false)
lorsque vous en créez une instance.
BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet();
bottomSheetDialogFragment.setCancelable(false);
bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag());
setCancelable(false)
empêchera également le rejet de la feuille inférieure lors d'une pression arrière. Si nous regardons la ressource de mise en page pour la feuille du bas dans Android bibliothèque de support de conception, il y a un composant Afficher avec l'ID touch_outside
Et il y a un OnClickListener
défini dans la méthode wrapInBottomSheet
de BottomSheetDialog
, qui est utilisé pour détecter les clics à l'extérieur et fermer la boîte de dialogue. Ainsi, pour éviter l'annulation au toucher en dehors de la feuille inférieure, nous devons supprimer le OnClickListener
.
Ajoutez ces lignes à la méthode onActivityCreated
(ou à toute autre méthode de cycle de vie après onCreateView
).
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View touchOutsideView = getDialog().getWindow()
.getDecorView()
.findViewById(Android.support.design.R.id.touch_outside);
touchOutsideView.setOnClickListener(null);
}
De plus, si vous souhaitez empêcher la fermeture de la feuille inférieure en glissant vers le bas, modifiez le comportement de la boîte de dialogue de la feuille inférieure Masquable false. Pour setHideable(false)
ajoutez le code suivant à la méthode onCreateDialog
.
@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
final BottomSheetDialog bottomSheetDialog =
(BottomSheetDialog) super.onCreateDialog(savedInstanceState);
bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override public void onShow(DialogInterface dialog) {
FrameLayout bottomSheet =
bottomSheetDialog.findViewById(Android.support.design.R.id.design_bottom_sheet);
if (null != bottomSheet) {
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setHideable(false);
}
}
});
return bottomSheetDialog;
}