Saltar al contenido

¿Cómo arreglar la altura y la posición del Snackbar?

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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *