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.



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


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

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>

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


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

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


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

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

+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


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

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!!!");

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)

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

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

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

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

}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.