web-dev-qa-db-fra.com

Comment changer la couleur de fond du snack?

Je montre snackbar dans DialogFragment Dans le clic positif de 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();

 As u can see my snackbars background color showing white color

Je passe la vue du dialoguefragment au snackbar. Je veux la couleur de fond noir? Comment puis-je faire ceci? Je retourne alertDialog dans le DialogFragment. Et le thème que je mets dans le 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 mette en blanc la couleur d’arrière-plan pour le dialogue, il convient de remplacer en définissant la couleur d’arrière-plan sur la barre.

70
Ajinkya

Essayez de définir la couleur de fond comme ceci:

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

Cela fonctionnera à 100%! 

121
Dusan Dimitrijevic

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();
72
Zubair Akber

Si vous souhaitez définir une couleur d'arrière-plan pour toutes vos barres Snack, remplacez simplement la valeur design_snackbar_background_color dans vos ressources. Par exemple:

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

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 manière: Vous pouvez également changer de couleur en changeant de thème d'activité.

12
Kailas Bhakade

Version Kotlin (avec une extension _):

Créez dans un fichier (par exemple Snackbar Extension.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()
8
Phil

C'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();
5
Nouman Ghaffar

En travaillant avec xamarin Android, j'ai découvert que ContextCompat.GetColor () renvoyait Int, mais setBackgroundColor () attend un paramètre de type Color . Voici comment je l'ai obtenu 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();
3
SATYAJEET RANJAN

Mettez-le dans une classe utilitaire:

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

Utilisant comme ceci:

Utility.showSnackBar(getApplicationContext(), findViewById(Android.R.id.content), "Add success!!!");
2
s-hunter

J'ai fait un petit cours sur les utils pour que je puisse facilement créer des barres de snack personnalisées grâce à 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 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
buradd

Aucune autre solution n'a vraiment fonctionné pour moi. Si je ne règle que la couleur d'arrière-plan de Snackbar, la mise en page sous TextView et Button est en couleur par défaut. Si je définissais l'arrière-plan de TextView, il clignotait un peu après l'affichage de SnackBar. 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 consiste à changer la couleur de fond du parent de TextView (SnackbarContentLayout). Maintenant, toute la barre de collation est bien colorée et ne clignote pas lorsqu'elle 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);
0
Brontes

Fondamentalement, les solutions fournies présentent un inconvénient. Ils changent la forme de snackbar et enlèvent 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)
0
Vaios
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();
}

}

0
Stepan Mazokha

setBackgroundResource() fonctionne aussi bien.

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

Comme aucune des autres réponses n’a fourni de substitution de style personnalisé (que je considère comme l’un des moyens les plus sûrs de procéder à cette mise à jour), je publie ici ma solution.

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

Dans la mesure où votre application utilise un nom personnalisé appelé MyAppTheme dans 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 fichier values/style.xml 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 -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="Android:background">@color/mySnackbarBackgroundColor</item>
</style>

et fournissez vos couleurs dans votre fichier values/colors.xml

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