Bagaimana cara mengubah warna latar belakang snackbar?

101

Saya menampilkan snackbar di DialogFragment Dalam klik Positif dari alertDialog. Ini potongan kode saya.

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

Seperti yang bisa Anda lihat, warna latar belakang snackbar saya menunjukkan warna putih

Saya melewati tampilan dialogfragment ke snackbar. Saya ingin warna latar belakang hitam? Bagaimana saya bisa melakukan ini? Saya mengembalikan alertDialog di DialogFragment. Dan tema yang saya atur ke dialog sebagai berikut

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

Meskipun saya menyetel warna latar belakang menjadi putih untuk dialog, itu harus diganti dengan menyetel warna latar belakang ke snackbar.

Ajinkya
sumber
mencoba yang sudah tidak membantu saya ... saya menelepon snack bar dari fragmen dialog + alertDialog di dalamnya dan saya melewati tombol klik positif view ke snackbar
Ajinkya

Jawaban:

172

Coba atur warna latar belakang seperti ini:

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

Ini akan berhasil 100%!

Dusan Dimitrijevic
sumber
50
Anda mungkin perlu melakukannyasnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95
2
Jika Anda menemukan halaman ini dari Google dan solusi di atas tidak berhasil untuk Anda, Anda mungkin perlu mencoba yang ini:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu
@modu Catatan yang getResources#getColorsudah tidak digunakan lagi sejak API level 23 (Marshmallow) dan ContextCompat#getColorsebaiknya digunakan sebagai gantinya.
Edric
89

Anda bisa melakukannya seperti ini

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
sumber
1
seperti yang Anda lihat saya melakukan hal yang persis sama tetapi tidak muncul dalam warna hitam
Ajinkya
saya telah menggunakan yang sama di salah satu proyek saya, coba tampilkan dalam aktivitas untuk pengujian, mungkin itu tidak berfungsi karena dialog
Zubair Akber
ya itu sedang bekerja pada aktivitas tetapi saya menginginkannya di fragmen dialog.
Ajinkya
saya pikir itu karena pandangan Anda sehingga Anda melewatinya
Zubair Akber
20

Jika Anda ingin menentukan warna latar belakang untuk semua Snackbar Anda, cukup timpa design_snackbar_background_colornilainya di suatu tempat di sumber daya Anda. Sebagai contoh:

<color name="design_snackbar_background_color" tools:override="true">@color/colorPrimaryLight</color>
4emodan
sumber
Solusi ini paling bersih dan bagus. Terima kasih!
AloDev
1
Berfungsi bagus, cukup tempelkan ini di colors.xml dan Anda sudah siap!
Avi Parshan
Nggak. Tidak berhasil untuk saya. Begitu pula dengan solusi lainnya.
AndroidDev
20

Karena tidak ada jawaban lain yang memberikan penggantian gaya kustom (yang saya anggap sebagai salah satu cara pembaruan teraman untuk melakukan itu), saya memposting di sini solusi saya.

Saya memposting solusi yang sudah membahas tema AndroidX( support design 28) baru .

Asalkan aplikasi Anda menggunakan kustom mereka yang disebut MyAppThemedi Anda 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">

Buat (jika Anda belum melakukannya) values/style.xmlfile yang menggantikan tema yang digunakan oleh aplikasi Anda:

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

dan berikan warna Anda pada values/colors.xmlfile Anda

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

Karena solusi di atas menghilangkan sudut bundar dari snacker karena pengaturan latar belakang dengan cara ini menggunakan desain snackbar lama, jika Anda ingin mempertahankan desain material Anda bisa.

  1. Jika Anda menargetkan API 21+

ganti android:backgrounddenganandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. Jika Anda menargetkan API <21, maka jika Anda memutuskan untuk menggunakan snackbar lama untuk API <21, Anda dapat menyetelnya MySnackbarStyledi folder res / values-21 / dan membiarkan gaya - lama - sebelumnya di folder res / values ​​Anda .

  2. Jika Anda menargetkan API <21 dan Anda ingin memiliki gaya material dari snackbar juga di tingkat API yang lebih rendah ini, Anda dapat mengubah gaya snackbar Anda di res / values ​​/ dengan cara ini:

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

dan pinjam my_snackbar_backgrounddari repo resmi Anda , dengan cara ini:

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

Ini adalah repo taman bermain .

masukkan deskripsi gambar di sini

shadowsheep
sumber
3
Ini adalah solusi terbersih dan terbaik
TrackDave
Ini mengubah ukuran snakbar
William
Perhatikan bahwa AppTheme Anda harus mewarisi dari Theme.MaterialComponents untuk dikompilasi
A.Mamode
Terima kasih untuk my_snackbar_background. Tanpanya Snackbar menggambar dengan sudut yang lebih bulat.
CoolMind
Saya menambahkan sedikit gaya lagi di stackoverflow.com/a/62006413/2914140 .
CoolMind
15

Versi Kotlin (dengan ekstensi ):

Buat dalam file (misalnya SnackbarExtension.kt) ekstensi:

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

Selanjutnya, di Aktivitas / Fragmen Anda, Anda akan dapat melakukan ini:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()
Phil
sumber
Benar-benar menyukai jawaban ini, saya juga menambahkan pewarnaan teks: 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) kembalikan ini}
willcwf
13

Kode di bawah ini berguna untuk mengubah warna teks pesan.

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

Cara Kedua: Anda juga dapat mengubah warna dengan mengubah tema kegiatan.

Kailas Bhakade
sumber
7

Sudah terlambat tetapi jika seseorang masih membutuhkan bantuan. Inilah solusi yang berhasil.

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

Saat Bekerja dengan xamarin android saya menemukan bahwa ContextCompat.GetColor () mengembalikan Int tetapi setBackgroundColor () mengharapkan Parameter bertipe Color. Jadi, inilah cara saya membuatnya berfungsi di proyek android xamarin saya.

Snackbar snackbarview =  Snackbar.Make(toolbar, message, Snackbar.LengthLong);
View snckView = snackbarview.View;                
snckView.SetBackgroundColor(Color.ParseColor(GetString(Resource.Color.colorPrimary)));
snackbarview.Show();
SATYAJEET RANJAN
sumber
1 untuk Xamarin View snckView = snackbarview.View; bukannya snackbar.getView();tidak tersedia tapi ParseColortidak berfungsi.
Cfun
@Cfun Bisakah Anda menjelaskan masalah Anda sedikit lagi, sehingga saya dapat membantu Anda.
SATYAJEET RANJAN
Saya buruk saya digunakan System.Drawing.Color.ParseColor sebagai gantinyaAndroid.Graphics.Color.ParseColor . sekarang saya punya: "nama 'getstring' tidak ada dalam konteks saat ini"
Cfun
@Cfun Apakah Anda mendapatkan kesalahan ini dalam aktivitas atau fragmen atau Anda memanggil getString () di kelas lain?
SATYAJEET RANJAN
Saya menyebutnya di beberapa Kelas lain.
Cfun
3

Dengan Snackbardisertakan dalam Material Components Library (com.google.android.material.snackbar.Snackbar ) cukup gunakan setBackgroundTintmetode ini.

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

masukkan deskripsi gambar di sini

Gabriele Mariotti
sumber
2

Saya membuat sedikit kelas utils sehingga saya dapat dengan mudah membuat snackbar berwarna kustom melalui aplikasi.

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

lalu untuk menggunakannya, seperti ini di mana pun di aplikasi:

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

Taruh di kelas Utilitas:

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

Menggunakan seperti ini:

Utility.showSnackBar(getApplicationContext(), findViewById(android.R.id.content), "Add success!!!");
pengusaha licik
sumber
2

Pada dasarnya solusi yang diberikan memiliki satu kelemahan. Mereka mengubah bentuk snackbar dan menghilangkan radius.

Secara pribadi, lebih suka yang seperti itu

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

Tidak ada solusi lain yang benar-benar berhasil untuk saya. Jika saya hanya menyetel warna latar belakang Snackbar, tata letak di bawah TextView dan Tombol dalam warna default. Jika saya menyetel latar belakang TextView, ia akan berkedip sedikit setelah SnackBar ditampilkan. Dan tata letak sekitar tombol masih dalam warna default.

Pada akhirnya saya menemukan bahwa cara terbaik bagi saya adalah mengubah warna latar belakang induk TextView (SnackbarContentLayout). Sekarang seluruh Snackbar diwarnai dengan benar dan tidak berkedip saat muncul.

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

setBackgroundResource() bekerja dengan baik.

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

Saya tidak tahu mengapa setBackgroundColor () tidak ditemukan dalam proyek saya. Itulah mengapa saya membuat fungsi ekstensi dan sekarang tidak masalah.

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

dan menyebutnya seperti di bawah

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