web-dev-qa-db-fra.com

Empêcher le rejet de BottomSheetDialogFragment lorsque vous touchez l'extérieur

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é?

18
RamithDR

Vous devez utiliser #setCancelable(false) lorsque vous en créez une instance.

    BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet();
    bottomSheetDialogFragment.setCancelable(false);
    bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag());
21
M. Erfan Mowlaei

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;
  }
12
shijo