sheet example bottomsheetdialog bottom android android-support-library android-support-design

android - example - bottom sheet layout dialog



¿Cómo cambio la altura predeterminada de un BottomSheetDialog? (5)

Combinando la solución de Nick y litao, esta es una versión completa de lo que hacemos:

BottomSheetDialog bottomSheet = new BottomSheetDialog(context); View view = View.inflate(context, R.layout.your_action_sheet, null); bottomSheet.setContentView(view); BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(((View) view.getParent())); bottomSheetBehavior.setPeekHeight(1000); bottomSheet.show();

He estado usando el nuevo BottomSheetDialog agregado en la biblioteca de soporte 23.2 , pero quiero cambiar la altura predeterminada del cuadro de diálogo. Sé que probablemente tenga que ver con el atributo behavior_peekHeight que controla la altura inicial, pero ¿cómo lo configuro en el BottomSheetDialog cuando no tengo acceso directo a BottomSheetBehavior ?


Otra forma es heredar BottomSheetDialogFragment y tener control sobre cómo y cuándo se configura la vista de contenido. Al subir al árbol de vista, puede obtener el comportamiento que BottomSheetDialog cierra la vista de contenido. No es realmente una buena solución, ya que requiere más pases de diseño. Es importante que cuando el estado de la hoja inferior sea STATE_HIDDEN , tengamos que descartar el diálogo; si no lo hacemos, violamos claramente la implementación provista en la biblioteca.

Después de configurar la altura de vista programáticamente, la vista de contenido debe llamar a requestLayout() que es de hecho otro paso de diseño.

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment { private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { setStateText(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.bottom_sheet_dialog_content_view, null); dialog.setContentView(contentView); mBottomSheetBehavior = BottomSheetBehavior.from(((View) contentView.getParent())); if (mBottomSheetBehavior != null) { mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); mBottomSheetBehavior.setPeekHeight(peekHeight); contentView.requestLayout(); } }


Puede establecer un bottomSheetDialogTheme en su actividad, anulando el atributo behavior_peekHeight del atributo bottomSheetStyle :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item> </style> <style name="AppBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> <item name="bottomSheetStyle">@style/AppModalStyle</item> </style> <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal"> <item name="behavior_peekHeight">@dimen/custom_peek_height</item> </style>

Esta misma técnica también se puede usar para otros atributos, como agregar <item name="behavior_hideable">true</item> a AppModalStyle para cambiar si la hoja de la parte inferior se puede ocultar.


puedes usar BottomSheetBehavior en tu código

BottomSheetDialog dialog = new BottomSheetDialog(content); . . . dialog.setContentView(view); BottomSheetBehavior mBehavior = BottomSheetBehavior.from((View) view.getParent()); mBehavior.setPeekHeight(your dialog height) dialog.show();


styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog"> <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item> </style> <style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal"> <item name="behavior_peekHeight">500dp</item> </style> BottomSheetDialog dialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); dialog.setContentView(R.layout.layout_bottom_sheet); dialog.show();