web-dev-qa-db-fra.com

BottomSheetDialogFragment - Comment définir une hauteur étendue (ou un décalage supérieur minimal)

Je crée un BottomSheetDialogFragment et je souhaite ajuster sa hauteur maximale développée. Comment puis je faire ça? Je peux récupérer le BottomSheetBehaviour mais tout ce que je peux trouver, c’est un passeur pour la hauteur de coup d’oeil mais rien pour la hauteur étendue.

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 ai-je besoin de ça? Parce que je montre un BottomSheet dialogue dans une activité en plein écran et que ça a l'air mauvais si le BottomSheet laisse un espace au-dessus ...

39
prom85

La hauteur est encapsulée car la vue gonflée est ajoutée à FrameLayout qui a layout_height=wrap_content. Voir FrameLayout (R.id.design_bottom_sheet) à l’adresse https://github.com/dandar3/Android-support-design/blob/master/res/layout/design_bottom_sheet_dialog.xml .

La classe ci-dessous rend la feuille inférieure plein écran, l’arrière-plan transparent et entièrement développé 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)

        });
    }

}

--- EDIT le 30 août 2018 --- J'ai réalisé un an plus tard que l'arrière-plan était coloré sur une mauvaise vue. Cela a fait glisser l'arrière-plan avec le contenu pendant qu'un utilisateur faisait glisser la boîte de dialogue. Je l'ai corrigé de sorte que la vue parent de la feuille du bas soit colorée.

22
Rubin Yoo

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 ensuite définir la hauteur dans les paramètres de disposition de cette vue sur la hauteur souhaitée.

bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
18
Jason Sznol

GRANDE MISE À JOUR Éviter la duplication de code Je donne un lien vers le réponse complète dans lequel vous pouvez trouver toutes les explications sur la pour obtenir un comportement complet comme Google Maps.


Je veux ajuster sa hauteur maximale élargie. Comment puis je faire ça?

BottomSheet et BottomSheetDialogFragment utilisent tous deux un comportement BottomSheetBe que vous pouvez trouver dans Support Library 23.x

La classe Java) a 2 utilisations différentes pour mMinOffset, l’une d’elles sert à définir la zone du parent qu’elle utilisera pour dessiner son contenu (peut-être un NestedScrollView). L’autre utilisation si pour définir le point d’ancrage développé, je veux dire, si vous le glissez vers le haut de la forme STATE_COLLAPSED, Il animera votre BottomSheet jusqu’à ce qu’il atteigne ce point d’ancrage MAIS si vous le pouvez continuez à glisser pour couvrir toute la hauteur du parent (hauteur CoordiantorLayout).

Si vous avez jeté un œil à 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;
}



Vous ne savez pas lequel de ces 2 comportements vous voulez, mais si vous avez besoin du second, suivez ces étapes:

  1. Créez une classe Java et étendez-la à partir de CoordinatorLayout.Behavior<V>
  2. Copiez le code de collage du fichier par défaut BottomSheetBehavior dans votre nouveau fichier.
  3. Modifiez 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. Modifiez les méthodes suivantes: onLayoutChild, onStopNestedScroll, BottomSheetBehavior<V> from(V view) et setState (facultatif)

Et voici à quoi ça ressemble:
[CustomBottomSheetBehavior]

13
MiguelHincapieC