Jak zmienić kolor tła batonika?

101

Wyświetlam pasek przekąsek w DialogFragment w pozytywnym kliknięciu alertDialog. Oto mój fragment kodu.

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

Jak widać, kolor tła moich snackbarów jest biały

Przekazuję widok fragmentu dialogowego do snackbaru. Chcę, aby tło było czarne? W jaki sposób mogę to zrobić? Wracam alertDialog w DialogFragment. I temat, który ustawiam w oknie dialogowym, jest następujący

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

Chociaż ustawiam kolor tła okna dialogowego na biały, powinien on zastąpić kolor tła paska przekąskowego.

Ajinkya
źródło
próbowałem to już mi nie pomogło ... dzwonię do snack baru z fragmentu okna dialogowego + alert Dialog w nim i przekazuję pozytywny widok kliknięcia przycisku do snackbaru
Ajinkya

Odpowiedzi:

172

Spróbuj ustawić kolor tła w następujący sposób:

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

Będzie działać w 100%!

Dusan Dimitrijevic
źródło
50
być może trzeba będzie to zrobićsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95
2
Jeśli znalazłeś tę stronę od Google, a powyższe rozwiązanie nie działa dla Ciebie, być może będziesz musiał wypróbować tę:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
moduł
@modu Uwaga, getResources#getColorktóra została wycofana od poziomu API 23 (Marshmallow) i ContextCompat#getColorpowinna być używana zamiast niej.
Edric,
89

możesz to zrobić w ten sposób

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
źródło
1
jak widzisz, zrobiłem dokładnie to samo, ale nie wyświetla się w kolorze czarnym
Ajinkya
Użyłem tego samego w jednym z moich projektów, spróbuj wyświetlić go w aktywności do testów, może to nie działa z powodu okna dialogowego
Zubair Akber
ya jego praca nad aktywnością, ale chcę, aby to było we fragmencie okna dialogowego.
Ajinkya
myślę, że to z powodu twojego poglądu, że przechodzisz do niego
Zubair Akber
20

Jeśli chcesz zdefiniować kolor tła dla wszystkich swoich Snackbarów, po prostu zastąp design_snackbar_background_colorwartość gdzieś w swoich zasobach. Na przykład:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>
4emodan
źródło
To rozwiązanie jest najczystsze i przyjemne. Dzięki!
AloDev
1
Działa świetnie, po prostu wklej to w colors.xml i gotowe!
Avi Parshan
Nie. Nie działa dla mnie. Żadne z pozostałych rozwiązań nie było.
AndroidDev
20

Ponieważ żadna z pozostałych odpowiedzi nie zawierała niestandardowego zastąpienia stylu (uważam to za jeden z najbezpieczniejszych sposobów aktualizacji), zamieszczam tutaj moje rozwiązanie.

Publikuję rozwiązanie, które już dotyczy nowego motywu AndroidX( support design 28).

Pod warunkiem, że aplikacja używa niestandardowych nazw nazwanych MyAppThemew 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">

Utwórz (jeśli jeszcze tego nie zrobiłeś) values/style.xmlplik nadpisujący motyw używany przez twoją aplikację:

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

i podaj swoje kolory w values/colors.xmlpliku

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

Ponieważ powyższe rozwiązanie usuwa okrągły narożnik przekąski, ponieważ ustawienie tła w ten sposób wykorzystuje starszą konstrukcję batonika, jeśli chcesz zachować materiał konstrukcyjny, który możesz.

  1. Jeśli celujesz w API 21+

wymienić android:backgroundzandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Jeśli celujesz MySnackbarStylew API <21, to jeśli zdecydujesz się użyć starszego snackbaru dla API <21, możesz ustawić abouve w folderze res / values-21 / i pozostawić poprzedni - starszy - styl w folderze res / values .

  2. Jeśli celujesz w API <21 i chcesz, aby materiałowy styl batonika również był na niższych poziomach API, możesz zmienić styl snackbaru w swoich res / values ​​/ w ten sposób:

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

i pożycz my_snackbar_backgroundz oficjalnego repozytorium w ten sposób:

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

Oto repozytorium placu zabaw .

wprowadź opis obrazu tutaj

shadowsheep
źródło
3
To najczystsze i najlepsze rozwiązanie
TrackDave
Zmienia rozmiar węża
William
Pamiętaj, że Twój AppTheme musi dziedziczyć po Theme.MaterialComponents do kompilacji
A.Mamode
Dzięki za my_snackbar_background. Bez tego Snackbar rysował zaokrąglonymi rogami.
CoolMind
Dodałem trochę więcej stylizacji na stackoverflow.com/a/62006413/2914140 .
CoolMind
15

Wersja Kotlin (z rozszerzeniem ):

Utwórz w pliku (na przykład SnackbarExtension.kt) rozszerzenie:

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

Następnie w swojej aktywności / fragmencie będziesz mógł to zrobić:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()
Phil
źródło
Naprawdę podoba mi się ta odpowiedź, dodałem również kolorowanie tekstu: zabawny 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

Poniższy kod jest przydatny do zmiany koloru tekstu wiadomości.

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

Drugi sposób: Możesz zmienić kolor, zmieniając również motyw aktywności.

Kailas Bhakade
źródło
7

Za późno, ale na wypadek, gdyby ktoś nadal potrzebował pomocy. Oto działające rozwiązanie.

      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
źródło
4

Podczas pracy z Xamarin Android dowiedziałem się, że ContextCompat.GetColor () zwraca Int, ale setBackgroundColor () oczekuje parametru typu Color. Oto, jak to działa w moim projekcie Xamarin Android.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();
SATYAJEET RANJAN
źródło
+1 dla platformy Xamarin View snckView = snackbarview.View;zamiast tego snackbar.getView();nie jest dostępny, ale ParseColornie działa.
Cfun
@Cfun Czy możesz bardziej szczegółowo wyjaśnić swój problem, abym mógł Ci w nim pomóc.
SATYAJEET RANJAN
Mój błąd użyłem System.Drawing.Color.ParseColorzamiast Android.Graphics.Color.ParseColor. teraz mam: „nazwa 'getstring' nie istnieje w obecnym kontekście”
Cfun
@Cfun Czy otrzymujesz ten błąd w działaniu lub fragmencie, czy też wywołujesz metodę getString () w innej klasie?
SATYAJEET RANJAN
Wzywam to w innej klasie.
Cfun
3

Z zawartością Snackbarw Bibliotece komponentów materiałów (com.google.android.material.snackbar.Snackbar ) wystarczy użyć tej setBackgroundTintmetody.

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

wprowadź opis obrazu tutaj

Gabriele Mariotti
źródło
2

Zrobiłem małą klasę narzędzi, dzięki czemu mogę łatwo tworzyć niestandardowe kolorowe przekąski w aplikacji.

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

następnie użyć go, na przykład w dowolnym miejscu w aplikacji:

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

Umieść to w klasie 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();
    }
}

Używanie w ten sposób:

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");
manewrowy
źródło
2

Zasadniczo dostarczone rozwiązania mają jedną wadę. Zmieniają kształt batonika i usuwają promień.

Osobiście wolę coś takiego

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
źródło
1

Żadne z innych rozwiązań tak naprawdę dla mnie nie zadziałało. Jeśli ustawię tylko kolor tła Snackbar, układ pod TextView i Button miał domyślny kolor. Jeśli ustawiłem tło TextView, po wyświetleniu SnackBar trochę zamrugało. A układ wokół przycisku był nadal w domyślnym kolorze.

Na koniec dowiedziałem się, że najlepszym sposobem jest dla mnie zmiana koloru tła rodzica TextView (SnackbarContentLayout). Teraz cały Snackbar jest odpowiednio pokolorowany i nie mruga, gdy się pojawia.

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
źródło
1

setBackgroundResource() działa równie dobrze.

Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundResource(R.color.background);
snackbar.show();
Maksim Ivanov
źródło
1

Nie wiem, dlaczego setBackgroundColor () nie znalazł się w moim projekcie. Dlatego stworzyłem funkcję rozszerzenia i teraz jest w porządku.

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

i nazwij to jak poniżej

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
źródło
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
źródło