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...
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.
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_COLLAPSED
il 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:
- Créer une classe Java et de l'étendre à partir de
CoordinatorLayout.Behavior<V>
- copier coller le code par défaut
BottomSheetBehavior
le fichier à votre nouvelle un. 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); }
Ajouter un nouvel état
public static final int STATE_ANCHOR_POINT = X;
Modifier les méthodes suivantes:
onLayoutChild
,onStopNestedScroll
,BottomSheetBehavior<V> from(V view)
etsetState
(facultatif)
Et voici comment le son ressemble:
[]
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;