Wie ändere ich die Hintergrundfarbe der Snackbar?

101

Ich zeige Snackbar in DialogFragment innerhalb des positiven Klicks von alertDialog. Hier ist mein Code-Snippet.

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

Wie Sie sehen können, zeigt meine Snackbars Hintergrundfarbe weiße Farbe

Ich übergebe die Ansicht des Dialogfragments an die Snackbar. Ich möchte die Hintergrundfarbe schwarz? Wie kann ich das machen? Ich gebe alertDialog im DialogFragment zurück. Und das Thema, das ich für den Dialog einstelle, ist wie folgt

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

Obwohl ich die Hintergrundfarbe für den Dialog auf Weiß setze, sollte sie überschrieben werden, indem die Hintergrundfarbe auf die Snackbar gesetzt wird.

Ajinkya
quelle
Ich habe versucht, dass mir das schon nicht geholfen hat ... Ich rufe die Snackbar aus dem Dialogfragment + alertDialog an und übergebe die positive Schaltfläche zum Klicken auf die Snackbar
Ajinkya

Antworten:

168

Versuchen Sie, die Hintergrundfarbe wie folgt einzustellen:

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

Es wird 100% funktionieren!

Dusan Dimitrijevic
quelle
50
Sie müssen möglicherweise tunsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95
2
Wenn Sie festgestellt haben, dass diese Seite von Google und einer sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
höheren
@modu Beachten Sie, dass getResources#getColordies seit API-Level 23 (Marshmallow) veraltet ist und ContextCompat#getColorstattdessen verwendet werden sollte.
Edric
89

Sie können es so machen

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
quelle
1
Wie Sie sehen können, habe ich genau das Gleiche getan, aber es wird nicht in schwarzer Farbe
angezeigt
Ich habe das gleiche in einem meiner Projekte verwendet, versuche es in Aktivität zum Testen anzuzeigen, möglicherweise funktioniert es aufgrund des Dialogs nicht
Zubair Akber
ya es arbeitet an Aktivität, aber ich möchte es auf dem Dialogfragment.
Ajinkya
Ich denke, es liegt an Ihrer Ansicht, dass Sie zu ihm
übergehen
20

Wenn Sie eine Hintergrundfarbe für alle Ihre Snackbars definieren möchten, überschreiben Sie einfach den design_snackbar_background_colorWert irgendwo in Ihren Ressourcen. Beispielsweise:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>
4emodan
quelle
Diese Lösung ist am saubersten und schönsten. Vielen Dank!
AloDev
1
Funktioniert super, steck das einfach in colours.xml und du bist fertig!
Avi Parshan
Nee. Hat bei mir nicht funktioniert. Keine der anderen Lösungen.
AndroidDev
20

Da keine der anderen Antworten eine benutzerdefinierte Stilüberschreibung lieferte (die ich als eine der sichersten Aktualisierungsmethoden betrachte), poste ich hier meine Lösung.

Ich poste eine Lösung, die bereits die neue AndroidX(support design 28 ) Thema befasst.

Vorausgesetzt, Ihre Anwendung verwendet eine benutzerdefinierte Funktion, die MyAppThemein Ihrem Verzeichnis aufgerufen wird 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">

Erstellen Sie (falls noch nicht geschehen) eine values/style.xmlDatei, die das von Ihrer Anwendung verwendete Thema überschreibt:

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

und geben Sie Ihre Farben in Ihrer values/colors.xmlDatei an

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

UPDATE 2020

Da die obige Lösung die runde Ecke des Snackers entfernt, weil der Hintergrund auf diese Weise eingestellt wird, wird das alte Snackbar-Design verwendet, wenn Sie das Materialdesign beibehalten möchten, das Sie können.

  1. Wenn Sie auf API 21+ abzielen

ersetzen android:backgrounddurchandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Wenn Sie auf API <21 abzielen, können Sie, wenn Sie sich für die Verwendung der Legacy-Snackbar für API <21 entscheiden, Ihr Abouve MySnackbarStyleim Ordner res / values-21 / festlegen und den vorherigen Legacy-Stil in Ihrem Ordner res / values belassen.

  2. Wenn Sie auf API <21 abzielen und den Materialstil der Snackbar auch in diesen niedrigeren API-Ebenen haben möchten, können Sie Ihren Snackbar-Stil in Ihren res / values ​​/ folgendermaßen ändern :

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

und leihen Sie Ihre my_snackbar_backgroundaus dem offiziellen Repo auf diese Weise:

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

Hier ist ein Spielplatz Repo .

Geben Sie hier die Bildbeschreibung ein

Schattenschaf
quelle
3
Dies ist die sauberste und beste Lösung
TrackDave
Es ändert die Größe der Snakbar
William
Beachten Sie, dass Ihr AppTheme von Theme.MaterialComponents erben muss, um kompiliert zu werden
A.Mamode
Danke für my_snackbar_background. Ohne es zeichnete Snackbar mit runderen Ecken.
CoolMind
Ich habe in stackoverflow.com/a/62006413/2914140 etwas mehr Styling hinzugefügt .
CoolMind
15

Kotlin-Version (mit Erweiterung ):

Erstellen Sie in einer Datei (zum Beispiel SnackbarExtension.kt) eine Erweiterung:

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

Als Nächstes können Sie in Ihrer Aktivität / Ihrem Fragment Folgendes tun:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()
Phil
quelle
Diese Antwort hat mir auch die Textfarbe hinzugefügt: 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

Der folgende Code ist nützlich, um die Textfarbe der Nachricht zu ändern.

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

Zweiter Weg: Sie können die Farbe ändern, indem Sie auch das Thema der Aktivität ändern.

Kailas Bhakade
quelle
7

Es ist zu spät, aber falls jemand noch Hilfe braucht. Hier ist die Arbeitslösung.

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

Während der Arbeit mit xamarin android habe ich herausgefunden, dass ContextCompat.GetColor () Int zurückgibt, aber setBackgroundColor () einen Parameter vom Typ Color erwartet. Hier ist, wie ich es in meinem Xamarin-Android-Projekt zum Laufen gebracht habe.

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

Verwenden Sie mit der Snackbarin der Material Components Library enthaltenen Methode (com.google.android.material.snackbar.Snackbareinfach die setBackgroundTintMethode.

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

Geben Sie hier die Bildbeschreibung ein

Gabriele Mariotti
quelle
2

Ich habe eine kleine Utensilienklasse gemacht, damit ich einfach benutzerdefinierte farbige Snackbars über die App erstellen kann.

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

dann, um es zu verwenden, so wie überall in der App:

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

Setzen Sie es in eine Utility-Klasse:

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

Verwenden Sie wie folgt:

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

Grundsätzlich haben die angebotenen Lösungen einen Nachteil. Sie ändern die Form der Snackbar und entfernen den Radius.

Ich persönlich bevorzuge so etwas

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

Keine der anderen Lösungen hat bei mir wirklich funktioniert. Wenn ich nur die Hintergrundfarbe von Snackbar einstelle, hat das Layout unter TextView und Button die Standardfarbe. Wenn ich den Hintergrund von TextView einstelle, blinkt es ein wenig, nachdem SnackBar angezeigt wurde. Das Layout der Schaltfläche war immer noch in der Standardfarbe.

Am Ende fand ich heraus, dass der beste Weg für mich darin besteht, die Hintergrundfarbe von TextViews Eltern (SnackbarContentLayout) zu ändern. Jetzt ist die gesamte Snackbar richtig gefärbt und blinkt nicht, wenn sie angezeigt wird.

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

setBackgroundResource() funktioniert genauso gut.

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

Ich weiß nicht, warum setBackgroundColor () in meinem Projekt nicht gefunden wurde. Aus diesem Grund habe ich eine Erweiterungsfunktion erstellt, die jetzt in Ordnung ist.

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

und nenne es wie unten

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

}}

Stepan Mazokha
quelle