Comment changer la couleur de fond du snack?

101

Je montre un snack-bar dans DialogFragment Dans le clic positif d'alertDialog. Voici mon extrait de code.

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

Comme vous pouvez le voir, la couleur de fond de mes snackbars montre la couleur blanche

Je passe la vue du fragment de dialogue au snack-bar. Je veux la couleur de fond noire? Comment puis-je faire ceci? Je renvoie alertDialog dans le DialogFragment. Et le thème que je mets au dialogue comme suit

<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>

Bien que je définisse la couleur d'arrière-plan sur blanc pour la boîte de dialogue, elle doit être remplacée en définissant la couleur d'arrière-plan sur le snackbar.

Ajinkya
la source
essayé que déjà ne m'aidait pas ... j'appelle le snack-bar à partir du fragment de dialogue + alertDialog dedans et je passe le bouton positif cliquez sur la vue au snack
Ajinkya

Réponses:

171

Essayez de définir la couleur d'arrière-plan comme ceci:

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

Cela fonctionnera à 100%!

Dusan Dimitrijevic
la source
50
vous devrez peut-être fairesnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95
2
Si vous avez trouvé que cette page de Google et que la solution ci-dessus ne fonctionnait pas pour vous, vous devrez peut-être essayer celle-ci à la place:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu
@modu Notez qui getResources#getColorest obsolète depuis le niveau d'API 23 (Marshmallow) et ContextCompat#getColordoit être utilisé à la place.
Edric
89

tu peux le faire comme ça

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();
Zubair Akber
la source
1
comme vous pouvez le voir, j'ai fait exactement la même chose mais cela ne s'affiche pas en noir
Ajinkya
J'ai utilisé la même chose dans l'un de mes projets, essayez de l'afficher dans l'activité pour le test, peut-être que cela ne fonctionne pas en raison d'un dialogue
Zubair Akber
ya son travail sur l'activité mais je le veux sur le fragment de dialogue.
Ajinkya
Je pense que c'est à cause de votre point de vue que vous y passez
Zubair Akber
20

Si vous souhaitez définir une couleur d'arrière-plan pour tous vos Snackbars, remplacez simplement la design_snackbar_background_colorvaleur quelque part dans vos ressources. Par exemple:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>
4émodan
la source
Cette solution est la plus propre et la plus agréable. Merci!
AloDev
1
Fonctionne très bien, collez-le simplement dans colors.xml et vous êtes prêt!
Avi Parshan
Nan. Cela n'a pas fonctionné pour moi. Aucune des autres solutions non plus.
AndroidDev
20

Comme aucune des autres réponses n'a fourni de remplacement de style personnalisé (que je considère comme l'un des moyens de mise à jour les plus sûrs pour le faire), je poste ici ma solution.

Je poste une solution qui aborde déjà le thème new AndroidX( support design 28).

À condition que votre application utilise un eux personnalisé appelé MyAppThemedans votre 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">

Créez (si vous ne l'avez pas déjà fait) un values/style.xmlfichier remplaçant le thème utilisé par votre application:

<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>

et fournissez vos couleurs dans votre values/colors.xmldossier

<?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>

MISE À JOUR 2020

Comme la solution ci-dessus supprime le coin rond du snacker, car le réglage de l'arrière-plan de cette façon utilise la conception du snack-bar héritée, si vous souhaitez conserver la conception du matériau, vous pouvez.

  1. Si vous ciblez l'API 21+

remplacer android:backgroundparandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Si vous ciblez l'API <21, si vous décidez d'utiliser le snackbar hérité pour l'API <21, vous pouvez définir votre abouve MySnackbarStyledans le dossier res / values-21 / et laisser le style précédent - hérité - dans votre dossier res / values .

  2. Si vous ciblez l'API <21 et que vous souhaitez avoir le style de matériau du snack-bar également dans ces niveaux d'API inférieurs, vous pouvez modifier votre style de snack dans votre res / values ​​/ de cette façon:

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

et emprunter votre my_snackbar_backgrounddu repo officiel , de cette façon:

<!-- 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>

Voici un repo de terrain de jeu .

entrez la description de l'image ici

mouton d'ombre
la source
3
C'est la solution la plus propre et la meilleure
TrackDave
C'est changer la taille du snakbar
William le
Notez que votre AppTheme doit hériter de Theme.MaterialComponents pour compiler
A.Mamode
Merci pour my_snackbar_background. Sans lui, Snackbar dessinait avec des coins plus ronds.
CoolMind
J'ai ajouté un peu plus de style dans stackoverflow.com/a/62006413/2914140 .
CoolMind
15

Version Kotlin (avec une extension ):

Créez dans un fichier (par exemple SnackbarExtension.kt) une extension:

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

Ensuite, dans votre activité / fragment, vous pourrez faire ceci:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()
Phil
la source
Vraiment comme cette réponse, j'ai également ajouté la coloration du texte: 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

Le code ci-dessous est utile pour changer la couleur du texte du message.

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

Deuxième façon: vous pouvez changer de couleur en changeant également le thème de l'activité.

Kailas Bhakade
la source
7

Il est trop tard mais au cas où quelqu'un aurait encore besoin d'aide. Voici la solution de travail.

      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();
Nouman Ghaffar
la source
4

En travaillant avec xamarin android, j'ai découvert que ContextCompat.GetColor () renvoie Int mais que setBackgroundColor () attend un paramètre de type Color. Voici donc comment je l'ai fait fonctionner dans mon projet android xamarin.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();
SATYAJEET RANJAN
la source
+1 pour Xamarin View snckView = snackbarview.View;au lieu de snackbar.getView();qui n'est pas disponible mais ParseColorne fonctionne pas.
Cfun
@Cfun Pouvez-vous expliquer un peu plus votre problème, afin que je puisse vous aider.
SATYAJEET RANJAN
Mon mauvais j'ai utilisé System.Drawing.Color.ParseColorau lieu de Android.Graphics.Color.ParseColor. maintenant j'ai: "le nom 'getstring' n'existe pas dans le contexte actuel"
Cfun
@Cfun Obtenez-vous cette erreur dans une activité ou un fragment ou appelez-vous getString () dans une autre classe?
SATYAJEET RANJAN
Je l'appelle dans une autre classe.
Cfun
3

Avec le Snackbarinclus dans la bibliothèque de composants matériels (com.google.android.material.snackbar.Snackbar ), utilisez simplement la setBackgroundTintméthode.

    Snackbar snackbar = Snackbar.make(view, "Snackbar custom style", Snackbar.LENGTH_LONG);
    snackbar.setBackgroundTint(ContextCompat.getColor(this,R.color.secondaryColor));
    snackbar.show();

entrez la description de l'image ici

Gabriele Mariotti
la source
2

J'ai créé un petit cours d'utils pour pouvoir facilement créer des barres-collations colorées personnalisées via l'application.

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;
    }
}

puis pour l'utiliser, comme ceci n'importe où dans l'application:

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

Mettez-le dans une classe Utility:

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

En utilisant comme ça:

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

Fondamentalement, les solutions proposées présentent un inconvénient. Ils changent la forme du snack et suppriment le rayon.

Personnellement, préférez quelque chose comme ça

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)
Vaios
la source
1

Aucune des autres solutions n'a vraiment fonctionné pour moi. Si je ne définis que la couleur d'arrière-plan de Snackbar, la disposition sous TextView et Button était dans la couleur par défaut. Si j'ai défini l'arrière-plan de TextView, il clignote un peu après que SnackBar ait été affiché. Et la disposition autour du bouton était toujours dans la couleur par défaut.

À la fin, j'ai découvert que le meilleur moyen pour moi est de changer la couleur d'arrière-plan du parent de TextView (SnackbarContentLayout). Maintenant, tout le Snackbar est correctement coloré et ne clignote pas lorsqu'il apparaît.

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);
Brontes
la source
1

setBackgroundResource() fonctionne aussi bien.

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

Je ne sais pas pourquoi setBackgroundColor () n'a pas été trouvé dans mon projet. C'est pourquoi j'ai créé une fonction d'extension et ça va maintenant.

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

et appelle ça comme ci-dessous

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") 
Aminul Haque Aome
la source
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();
}

}

Stépan Mazokha
la source