Si encuentras algún detalle que te causa duda puedes dejarlo en la sección de comentarios y te ayudaremos rápidamente.
Solución:
Recientemente resolví esto restando la altura de la barra de navegación del margen inferior de la vista de Snackbar.
Primero necesitamos la altura de la barra de navegación. Encontré un código para eso en la respuesta marcada como correcta aquí: Cómo REALMENTE obtener la altura de la barra de navegación en Android
Luego, use el siguiente código para ajustar el margen inferior de Snackbar:
final Snackbar snackbar = Snackbar.make(findViewById(R.id.fullscreen_content),
message, Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
// Adjust Snackbar height for fullscreen immersive mode
int navbarHeight = getNavigationBarSize(this).y;
CoordinatorLayout.LayoutParams parentParams = (CoordinatorLayout.LayoutParams) snackbarView.getLayoutParams();
parentParams.setMargins(0, 0, 0, 0 - navbarHeight);
snackbarView.setLayoutParams(parentParams);
snackbar.show();
Tenga en cuenta que utilicé los LayoutParams de un CoordinatorLayout. Debe reemplazar el diseño del coordinador con cualquier tipo de diseño principal que haya pasado a su Snackbar.make()
función (en mi caso, R.id.fullscreen_content
es un diseño de coordinador). Lo bueno de usar CoordinatorLayout es que permite descartar Snackbars deslizando el dedo como un comportamiento estándar.
La respuesta aceptada funcionó con versiones anteriores de las bibliotecas de soporte donde el Snackbar
era solo una vista rectangular. Lo que sucede realmente al cambiar el margen a un valor negativo es simplemente cortar la parte inferior del SnackbarLayout
(el diseño del contenedor de la Snackbar
) por lo que las versiones más nuevas donde el Snackbar
tiene esquinas redondeadas se ven mal con esta solución.
La pista está en el código aquí: https://github.com/material-components/material-components-android/blob/cd59e98f7e2185ddb075ff0fc91f29765d562968/lib/java/com/google/android/material/snackbar/BaseTransientBottomBar.java#L272
Lo que sucede en realidad es que se agrega relleno al contenedor, por lo que la forma de corregir correctamente la altura es restablecer el relleno a la cantidad correcta. Puede hacer esto agregando un adicional OnApplyWindowInsetsListener
como los siguientes (colocar el acolchado inferior al mismo nivel que el superior hace que el Snackbar
parece normal):
ViewCompat.setOnApplyWindowInsetsListener(snackbar.view) v, insets ->
v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, v.paddingTop)
insets
Entonces, como el Snackbar
ahora será la altura correcta pero aparecerá detrás de una barra de navegación translúcida, puede aumentar el margen inferior por el valor del recuadro inferior:
ViewCompat.setOnApplyWindowInsetsListener(view) v, insets ->
v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, v.paddingTop)
val params = v.layoutParams as ViewGroup.MarginLayoutParams
params.updateMargins(
params.leftMargin,
params.topMargin,
params.rightMargin,
params.bottomMargin + insets.systemWindowInsetBottom
)
v.layoutParams = params
insets
En realidad, esto se solucionó en las bibliotecas alfa de Material 1.1.0 (la biblioteca ahora cambia el margen en lugar del relleno), pero probablemente aún no estén listas para su uso en producción.
Mire esta respuesta https://stackoverflow.com/a/42180120/2550743 y simplemente reemplace
params.setMargins(params.leftMargin,
params.topMargin,
params.rightMargin,
params.bottomMargin + ScreenUtils.getNavigationBarHeight(activity));
a
params.setMargins(params.leftMargin,
params.topMargin,
params.rightMargin,
params.bottomMargin - ScreenUtils.getNavigationBarHeight(activity));
Reseñas y valoraciones
Recuerda que tienes concesión de añadir una valoración justa .