¿Cómo cambiar el color de fondo de la cafetería?


101

Estoy mostrando snackbar en DialogFragment dentro del clic positivo de alertDialog. Aquí está mi fragmento de código.

Snackbar snackbar = Snackbar.make(view, "Please enter customer name", Snackbar.LENGTH_LONG)
                .setAction("Action", null);
View sbView = snackbar.getView();
sbView.setBackgroundColor(Color.BLACK);
snackbar.show();

Como puede ver, el color de fondo de mi snackbars muestra un color blanco

Estoy pasando la vista del fragmento de diálogo al snackbar. ¿Quiero el color de fondo negro? ¿Cómo puedo hacer esto? Estoy devolviendo alertDialog en DialogFragment. Y el tema que estoy configurando para el diálogo es el siguiente

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">

    <!-- Used for the buttons -->
    <item name="colorAccent">@color/accent</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">@color/primary</item>
    <!-- Used for the background -->
    <item name="android:background">@color/white</item>
</style>

Aunque estoy configurando el color de fondo en blanco para el diálogo, debería anularlo configurando el color de fondo en la barra de refrigerios.



Intenté que ya no me ayuda ... Estoy llamando a la barra de bocadillos desde el fragmento de diálogo + alertDialog en él y estoy pasando la vista de clic del botón positivo a la
barra de bocadillos

Respuestas:


171

Intente configurar el color de fondo como este:

sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.BLACK));

¡Funcionará al 100%!


50
puede que tenga que hacersnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
Si encontró esta página de Google y la solución anterior no funcionó para usted, es posible que deba probar esta en su lugar:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
module

@modu Tenga en cuenta que getResources#getColorha quedado obsoleto desde el nivel de API 23 (Marshmallow) y ContextCompat#getColordebería usarse en su lugar.
Edric

89

puedes hacerlo así

Snackbar snackbar;
snackbar = Snackbar.make(view, "Message", Snackbar.LENGTH_SHORT);
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor(yourColor);
TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(textColor);
snackbar.show();

1
como puede ver, hice exactamente lo mismo pero no se muestra en color negro
Ajinkya

He usado lo mismo en uno de mis proyectos, trato de mostrarlo en actividad para probar, puede ser que no funcione debido al diálogo
Zubair Akber

ya está trabajando en la actividad, pero lo quiero en el fragmento de diálogo.
Ajinkya

Creo que es debido a su opinión que está pasando a él
Zubair Akber

20

Si desea definir un color de fondo para todas sus Snackbars, simplemente anule el design_snackbar_background_colorvalor en algún lugar de sus recursos. Por ejemplo:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>

Esta solución es la más limpia y agradable. ¡Gracias!
AloDev

1
Funciona muy bien, solo pegue esto en colors.xml y listo.
Avi Parshan

No No funcionó para mí. Tampoco lo hizo ninguna de las otras soluciones.
AndroidDev

20

Como ninguna de las otras respuestas proporcionó una anulación de estilo personalizado (que considero una de las formas de actualización más seguras de hacerlo), publico aquí mi solución.

Publico una solución que ya aborda el tema new AndroidX( support design 28).

Siempre que su aplicación utilice un nombre personalizado llamado MyAppThemeen su AndroidManifest.xml:

<application
        android:name=".MyApplicationName"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:roundIcon="@mipmap/icon_round"
        android:label="@string/app_name"
        android:theme="@style/MyAppTheme">

Cree (si aún no lo ha hecho) un values/style.xmlarchivo que anule el tema utilizado por su aplicación:

<style name="MyAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/myColorPrimary</item>
    <item name="colorPrimaryDark">@color/myColorPrimaryDark</item>
    <item name="colorAccent">@color/myColorAccent</item>
    <item name="snackbarStyle">@style/MySnackBarStyle</item>
</style>

<!-- snackbar style in res/values -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@color/mySnackbarBackgroundColor</item>
</style>

y proporcione sus colores en su values/colors.xmlarchivo

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="myColorPrimary">#008577</color>
    <color name="myColorPrimaryDark">#00574B</color>
    <color name="myColorAccent">#D81B60</color>
    <color name="mySnackbarBackgroundColor">#D81B60</color>
</resources>

ACTUALIZAR 2020

Como la solución anterior elimina la esquina redonda del bocadillo, porque al establecer el fondo de esta manera se usa el diseño heredado de la barra de bocadillos, si desea conservar el diseño del material, puede hacerlo.

  1. Si tiene como objetivo API 21+

reemplazar android:backgroundconandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Si está apuntando a API <21, entonces si decide usar la barra MySnackbarStylede bocadillos heredada para API <21, puede configurar su abouve en la carpeta res / values-21 / y dejar el estilo anterior (heredado) en su carpeta res / values .

  2. Si está apuntando a API <21 y desea tener el estilo de material de la barra de aperitivos también en estos niveles de API más bajos, puede cambiar el estilo de la barra de aperitivos en sus res / valores / de esta manera:

<!-- snackbar style in res/values/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:background">@drawable/my_snackbar_background</item>
</style>

y pida prestado su my_snackbar_backgrounddel repositorio oficial , de esta manera:

<!-- in res/drawable/ -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="4dp"/>
    <solid android:color="@color/mySnackbarBackgroundColor"/>
</shape>

Aquí hay un repositorio de juegos .

ingrese la descripción de la imagen aquí


3
Esta es la mejor y más limpia solución
TrackDave

Es cambiar el tamaño del snakbar
William

Tenga en cuenta que su AppTheme debe heredar de Theme.MaterialComponents para compilar
A.Mamode

Gracias por my_snackbar_background. Sin él, Snackbar dibujó con esquinas más redondeadas.
CoolMind

Agregué un poco más de estilo en stackoverflow.com/a/62006413/2914140 .
CoolMind

15

Versión de Kotlin (con extensión ):

Cree en un archivo (por ejemplo, SnackbarExtension.kt) una extensión:

fun Snackbar.withColor(@ColorInt colorInt: Int): Snackbar{
   this.view.setBackgroundColor(colorInt)
   return this
}

A continuación, en su Actividad / Fragmento, podrá hacer esto:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()

Realmente me gustó esta respuesta, también agregué el color del texto: fun Snackbar.withColor (@ColorInt backgroundColor: Int, @ColorInt textColor: Int): Snackbar {this.view.setBackgroundColor (backgroundColor) this.view.findViewById <TextView> ( android.support.design.R.id.snackbar_text) .setTextColor (textColor) return this}
willcwf

13

El código de abajo es útil para cambiar el color del texto del mensaje.

Snackbar snackbar = Snackbar.make(rootView, "Enter Your Message",Snackbar.LENGTH_SHORT);
View view = snackbar.getView();
TextView tv = (TextView)view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.RED);
snackbar.show();

Segunda forma: puede cambiar el color cambiando también el tema de la actividad.


7

Es demasiado tarde, pero en caso de que alguien todavía necesite ayuda. Aquí está la solución de trabajo.

      Snackbar snackbar = Snackbar.make(mainView, text, Snackbar.LENGTH_LONG);
    View snackBarView = snackbar.getView();
    snackBarView.setBackgroundColor(context.getResources().getColor(R.color.btn_background_color));
    snackbar.show();

4

Mientras trabajaba con xamarin android descubrí que ContextCompat.GetColor () devuelve Int pero el setBackgroundColor () espera un parámetro de tipo Color. Así que así es como lo hice funcionar en mi proyecto de Android xamarin.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();

+1 para Xamarin en View snckView = snackbarview.View;lugar del snackbar.getView();cual no está disponible pero ParseColorno funciona.
Cfun

@Cfun ¿Puedes explicar tu problema un poco más para que yo pueda ayudarte con él?
SATYAJEET RANJAN

Mi mal lo usé en System.Drawing.Color.ParseColorlugar de Android.Graphics.Color.ParseColor. ahora tengo: "el nombre 'getstring' no existe en el contexto actual"
Cfun

@Cfun ¿Está recibiendo este error en una actividad o un fragmento o está llamando a getString () en alguna otra clase?
SATYAJEET RANJAN

Lo estoy llamando en alguna otra clase.
Cfun


2

Hice una pequeña clase de utilidades para poder hacer fácilmente barras de bocadillos de colores personalizados a través de la aplicación.

package com.yourapppackage.yourapp;

import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SnackbarUtils {

    private int BACKGROUND_COLOR;
    private int TEXT_COLOR;
    private int BUTTON_COLOR;
    private String TEXT;


    public SnackbarUtils(String aText, int aBgColor, int aTextColor, int aButtonColor){
        this.TEXT = aText;
        this.BACKGROUND_COLOR = aBgColor;
        this.TEXT_COLOR = aTextColor;
        this.BUTTON_COLOR = aButtonColor;
    }

    public Snackbar snackieBar(){
        Snackbar snackie = Snackbar.make(MainActivity.getInstance().findViewById(android.R.id.content), TEXT, Snackbar.LENGTH_LONG);
        View snackView = snackie.getView();
        TextView snackViewText = (TextView) snackView.findViewById(android.support.design.R.id.snackbar_text);
        Button snackViewButton = (Button) snackView.findViewById(android.support.design.R.id.snackbar_action);
        snackView.setBackgroundColor(BACKGROUND_COLOR);
        snackViewText.setTextColor(TEXT_COLOR);
        snackViewButton.setTextColor(BUTTON_COLOR);
        return snackie;
    }
}

luego usarlo, así en cualquier lugar de la aplicación:

new SnackbarUtils("This is the text displayed", Color.RED, Color.BLACK, Color.YELLOW).snackieBar().setAction("OTAY", v -> { 
     //donothing
     }).show();

2

Ponlo en una clase de utilidad:

public class Utility {
    public static void showSnackBar(Context context, View view, String text) {
        Snackbar sb = Snackbar.make(view, text, Snackbar.LENGTH_SHORT);
        sb.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.colorAccent));
        sb.show();
    }
}

Usando así:

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");

2

Básicamente, las soluciones que se proporcionaron tienen una desventaja. Cambian la forma de la barra de bocadillos y eliminan el radio.

Personalmente, prefiero algo así

val snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
val view = snackbar.getView();
val color = view.resources.getColor(colorId)
view.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)

1

Ninguna de las otras soluciones realmente funcionó para mí. Si solo configuro el color de fondo de Snackbar, el diseño en TextView y Button estaba en el color predeterminado. Si configuro el fondo de TextView, parpadeó un poco después de que se mostró SnackBar. Y el diseño alrededor del botón todavía estaba en el color predeterminado.

Al final descubrí que la mejor manera para mí es cambiar el color de fondo del padre de TextView (SnackbarContentLayout). Ahora todo el Snackbar está coloreado correctamente y no parpadea cuando aparece.

snack = Snackbar.make(view, text, duration)
View view = snack.getView();
view.setBackgroundColor(BACKGROUND_COLOR);
TextView tv = view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(TEXT_COLOR);
((SnackbarContentLayout) tv.getParent()).setBackgroundColor(BACKGROUND_COLOR);

1

setBackgroundResource() funciona igual de bien.

Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();

1

No sé por qué setBackgroundColor () no se encontró en mi proyecto. Por eso creé una función de extensión y ahora está bien.

fun View.showSnackBar(message: String) {
    val snackBar = Snackbar.make(this, message, Snackbar.LENGTH_LONG)
    snackBar.setBackgroundTint(ContextCompat.getColor(this.context, R.color.colorAccent))
    snackBar.show()
}

y llámalo como un bramido

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/login_holder_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   // your UI

</FrameLayout>

LoginActivity.kt

login_holder_layout.showSnackBar("Invalid Email") 

0
public class CustomBar {

public static void show(View view, String message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

public static void show(View view, @StringRes int message, boolean isLong) {
    Snackbar s = Snackbar.make(view, message, isLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
    s.getView().setBackgroundColor(ContextCompat.getColor(view.getContext(), R.color.red_900));
    s.show();
}

}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.