sheet modal medium bottomsheetdialogfragment bottom behaviour android android-support-library androiddesignsupport bottom-sheet

android - modal - BottomSheetDialogFragment: cómo establecer la altura expandida(o el desplazamiento superior mínimo)



fragment modal (3)

Creo un BottomSheetDialogFragment y quiero ajustar su altura máxima expandida. ¿Cómo puedo hacer eso? Puedo recuperar el BottomSheetBehaviour pero todo lo que puedo encontrar es un setter para la altura de peek pero nada para la altura expandida.

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

EDITAR

¿Por qué necesito eso? Porque muestro un BottomSheet diálogo de BottomSheet en una actividad de pantalla completa y se ve mal si la hoja BottomSheet deja un espacio en la parte superior ...


Encontré una respuesta mucho más simple; en su ejemplo, donde obtiene FrameLayout para la hoja inferior usando este código

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

luego puede establecer la altura en los parámetros de diseño para esa Vista a la altura a la que desee establecer la altura expandida.

bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;


La altura se está ajustando debido a que la vista inflada se agrega a FrameLayout, que tiene layout_height=wrap_content . Consulte FrameLayout (R.id.design_bottom_sheet) en https://github.com/dandar3/android-support-design/blob/master/res/layout/design_bottom_sheet_dialog.xml .

La clase siguiente hace que la hoja inferior se muestre en pantalla completa, el fondo transparente y completamente expandido a la parte superior.

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) }); } }

--- EDITAR 30 de agosto de 2018 --- Me di cuenta un año después de que el fondo estaba coloreado en una vista incorrecta. Esto arrastró el fondo junto con el contenido mientras un usuario arrastraba el diálogo. Lo arreglé para que la vista principal de la hoja inferior esté coloreada.


GRAN ACTUALIZACIÓN Evitar el código duplicado Le doy un enlace a la respuesta completa en la que puede encontrar toda la explicación sobre cómo obtener un comportamiento completo como Google Maps.

Quiero ajustar su altura máxima expandida. ¿Cómo puedo hacer eso?

Tanto BottomSheet como BottomSheetDialogFragment utilizan un elemento BottomSheetBehavior que puede encontrar en Support Library 23.x

Esa clase de Java tiene 2 usos diferentes para mMinOffset , uno de ellos se usa para definir el área del padre que usará para dibujar su contenido (tal vez un NestedScrollView ). Y el otro uso si para definir el punto de anclaje expandido, quiero decir, si lo desliza hacia arriba desde STATE_COLLAPSED , animará su BottomSheet hasta que llegue a este punto de anclaje PERO si todavía puede deslizarse hacia arriba para cubrir toda la altura principal (CoordiantorLayout Height) .

Si BottomSheetDialog un vistazo a BottomSheetDialog , verás este método:

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



No tengo idea de cuál de los 2 comportamientos que desea, pero si necesita el segundo, siga estos pasos:

  1. Cree una clase de Java y extiéndala desde CoordinatorLayout.Behavior<V>
  2. Copie y pegue el código del archivo BottomSheetBehavior predeterminado en su nuevo archivo.
  3. Modifique el método clampViewPositionVertical con el siguiente código:

    @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. Agregar un nuevo estado

    public static final int STATE_ANCHOR_POINT = X;

  5. Modifique los siguientes métodos: onLayoutChild , onStopNestedScroll , BottomSheetBehavior<V> from(V view) y setState (opcional)

Y aquí es cómo se ve:
[ ]