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