BottomSheetDialogFragment - comment définir la hauteur étendue (ou offset min top))

je crée un BottomSheetDialogFragment et je veux l'adapter maximale de l'étendue de la hauteur. Comment puis-je le faire? Je peux récupérer l' BottomSheetBehaviour mais tout ce que je peux trouver est un setter pour la hauteur de la pointe mais rien pour la hauteur augmentée.

public class DialogMediaDetails extends BottomSheetDialogFragment
{
    @Override
    public void setupDialog(Dialog dialog, int style)
    {
        super.setupDialog(dialog, style);
        View view = View.inflate(getContext(), R.layout.dialog_media_details, null);
        dialog.setContentView(view);

        ...

        View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet);
        BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setPeekHeight(...);
        // how to set maximum expanded height???? Or a minimum top offset?

    }
}

EDIT

pourquoi j'ai besoin de ça? Parce que je te montre un BottomSheet dialogue dans une activité plein écran et il semble mauvais si le BottomSheet laisse une place sur le dessus...

30
demandé sur prom85 2016-03-16 12:00:14

3 réponses

la hauteur est enveloppée en raison de la vue gonflée est ajoutée à la sortie du cadre qui a layout_height=wrap_content. Voir FrameLayout(R. id.design_bottom_sheet) à https://github.com/dandar3/android-support-design/blob/master/res/layout/design_bottom_sheet_dialog.xml.

la classe ci-dessous rend la feuille du bas plein écran, le fond transparent et entièrement étendu vers le haut.

public class FullScreenBottomSheetDialogFragment extends BottomSheetDialogFragment {


    @CallSuper
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);
    }


    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();

        if (dialog != null) {
            View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet);
            bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
        }
        View view = getView();
        view.post(() -> {
            View parent = (View) view.getParent();
            CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (parent).getLayoutParams();
            CoordinatorLayout.Behavior behavior = params.getBehavior();
            BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) behavior;
            bottomSheetBehavior.setPeekHeight(view.getMeasuredHeight());
            ((View)bottomSheet.getParent()).setBackgroundColor(Color.TRANSPARENT)

        });
    }

}

- - - modifier le 30 août 2018 --- J'ai réalisé un an plus tard que le le fond était coloré sur une mauvaise vue. Cela a traîné l'arrière-plan avec le contenu pendant qu'un utilisateur traînait la boîte de dialogue. Je l'ai fixé pour que la vue de parent de la feuille inférieure soit colorée.

11
répondu Rubin Yoo 2018-08-30 17:51:24

GRANDE MISE À JOUR Éviter le code dupliqué je donne un lien vers le réponse dans lequel vous pouvez trouver toutes les explications sur la façon d'obtenir un comportement complet comme Google Maps.


je veux ajuster sa hauteur maximale. Comment puis-je le faire?

BottomSheet et BottomSheetDialogFragment utilisez un comportement BottomSheetBehavior que vous pouvez trouver dans la bibliothèque de soutien 23.x



cette classe Java a 2 utilisations différentes pour mMinOffset, l'un d'eux est utilisé pour définir la zone de la mère, il va utiliser pour attirer son contenu (peut-être un NestedScrollView). Et l'autre utilisation si pour définir le point d'ancrage élargi, je veux dire, si vous le faites glisser vers le haut de la forme STATE_COLLAPSEDil animera votre BottomSheet jusqu'à ce qu'il atteigne ce point d'ancrage, mais si vous pouvez continuer à glisser pour couvrir toute la hauteur des parents (Coord. Hauteur.)



Si vous avez pris un coup d'oeil à BottomSheetDialog vous verrez cette méthode:

private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
    final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
            android.support.design.R.layout.design_bottom_sheet_dialog, null);
    if (layoutResId != 0 && view == null) {
        view = getLayoutInflater().inflate(layoutResId, coordinator, false);
    }
    FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(android.support.design.R.id.design_bottom_sheet);
    BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback);
    if (params == null) {
        bottomSheet.addView(view);
    } else {
        bottomSheet.addView(view, params);
    }
    // We treat the CoordinatorLayout as outside the dialog though it is technically inside
    if (shouldWindowCloseOnTouchOutside()) {
        final View finalView = view;
        coordinator.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (isShowing() &&
                        MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP &&
                        !coordinator.isPointInChildBounds(finalView,
                                (int) event.getX(), (int) event.getY())) {
                    cancel();
                    return true;
                }
                return false;
            }
        });
    }
    return coordinator;
}





Aucune idée de l'un de ces 2 comportements que vous voulez, mais si vous avez besoin du second, suivez ces étapes:



  1. Créer une classe Java et de l'étendre à partir de CoordinatorLayout.Behavior<V>
  2. copier coller le code par défaut BottomSheetBehavior le fichier à votre nouvelle un.
  3. Modifier la méthode clampViewPositionVertical avec le code suivant:

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
        return constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
    }
    int constrain(int amount, int low, int high) {
        return amount < low ? low : (amount > high ? high : amount);
    }
    
  4. Ajouter un nouvel état

    public static final int STATE_ANCHOR_POINT = X;
    
  5. Modifier les méthodes suivantes:onLayoutChild,onStopNestedScroll,BottomSheetBehavior<V> from(V view) et setState (facultatif)

Et voici comment le son ressemble:

[CustomBottomSheetBehavior]

7
répondu MiguelHincapieC 2018-09-03 05:27:16

j'ai trouvé une réponse beaucoup plus simple; dans votre exemple où vous obtenez le FrameLayout pour la feuille du bas en utilisant ce code

View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet);

vous pouvez alors définir la hauteur sur les paramètres de mise en page pour cette vue à n'importe quelle hauteur vous voulez définir la hauteur étendue à.

bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
5
répondu Jason Sznol 2016-06-01 16:09:50