Snackbar'ın arka plan rengi nasıl değiştirilir?


103

DialogFragment'de alertDialog'un Pozitif tıklaması içinde snackbar gösteriyorum. İşte kod pasajım.

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

Atıştırmalık çubuklarının arka plan renginin beyaz renkte olduğunu gördüğünüz gibi

İletişim kutusunun görünümünü atıştırmalık çubuğuna geçiriyorum. Arka plan renginin siyah olmasını ister miyim? Bunu nasıl yapabilirim? DialogFragment'da alertDialog'u döndürüyorum. Ve diyaloğa ayarladığım tema aşağıdaki gibi

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

İletişim kutusu için arka plan rengini beyaz olarak ayarlasam da, arka plan rengini snackbar olarak ayarlayarak geçersiz kılmalı.



Zaten ... i iletişim parçası + AlertDialog gelen snack bar arıyorum ve ben snackbar olumlu düğme tıklama görünümü geçirerek bana yardımcı değil denedi
Ajinkya

Yanıtlar:


173

Arka plan rengini şu şekilde ayarlamayı deneyin:

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

% 100 çalışacak!


51
yapmanız gerekebilirsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
Bu sayfayı Google'dan bulduysanız ve yukarıdaki çözüm sizin için işe yaramadıysa, bunun yerine şunu denemeniz gerekebilir:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu

@modu getResources#getColorAPI düzey 23'ten (Marshmallow) bu yana kullanımdan kaldırıldığını ve ContextCompat#getColorbunun yerine kullanılması gerektiğini unutmayın.
Edric

90

bunu böyle yapabilirsin

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
gördüğünüz gibi tam olarak aynı şeyi yaptım ama siyah renkte
görünmüyor

aynısını projemden birinde kullandım, test için etkinlikte görüntülemeye çalışıyorum, diyalog nedeniyle çalışmıyor olabilir
Zubair Akber

ya aktivite üzerinde çalışıyor ama onu diyalog bölümünde istiyorum.
Ajinkya

Sanırım sizin görüşünüzden dolayı ona
geçiyorsunuz

20

Tüm Snackbar'larınız için bir arka plan rengi tanımlamak istiyorsanız design_snackbar_background_color, kaynaklarınızda bir yerde değeri geçersiz kılmanız yeterlidir . Örneğin:

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

Bu çözüm en temiz ve güzel. Teşekkürler!
AloDev

1
Harika çalışıyor, bunu colours.xml dosyasına yapıştırın ve hazırsınız!
Avi Parshan

Hayır! Benim için çalışmadı. Diğer çözümlerin hiçbiri de yapmadı.
AndroidDev

20

Diğer yanıtların hiçbiri özel bir stil geçersiz kılma sağlamadığından (bunu yapmanın en güvenli güncelleme yollarından biri olduğunu düşünüyorum) çözümümü buraya gönderiyorum.

Zaten yeni AndroidX( support design 28) temasına hitap eden bir çözüm gönderiyorum.

Uygulamanızın MyAppThemesizin adınızda çağrılan bir özel kullanması şartıyla 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">

values/style.xmlUygulamanız tarafından kullanılan temayı geçersiz kılan (henüz yapmadıysanız) dosya oluşturun:

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

ve renklerinizi values/colors.xmldosyanıza ekleyin

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

GÜNCELLEME 2020

Yukarıdaki çözüm, atıştırmalıkların yuvarlak köşesini ortadan kaldırdığı için arka planı bu şekilde ayarlamak, eski snackbar tasarımını kullanır, eğer malzeme tasarımını korumak istiyorsanız yapabilirsiniz.

  1. API 21+ hedefliyorsanız

yerine android:backgroundsahipandroid:backgroundTint

<!-- snackbar style in res/values-21/ -->
<style name="MySnackBarStyle" parent="Widget.MaterialComponents.Snackbar">
    <item name="android:backgroundTint">@color/mySnackbarBackgroundColor</item>
</style>
  1. API <21 için eski snackbar kullanmaya karar verirseniz o zaman API <21 hedeflemesi varsa size abouve ayarlayabilirsiniz MySnackbarStyleiçinde res / değerler-21 / klasör ve önceki bırakın - miras - senin stili res / değerler klasörü.

  2. API <21'i hedefliyorsanız ve atıştırmalık çubuğunun materyal stilini bu düşük API seviyelerinde de kullanmak istiyorsanız, snackbar stilinizi res / değerleriniz / bu şekilde değiştirebilirsiniz:

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

ve ödünç my_snackbar_backgroundgelen resmi repo , bu şekilde:

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

İşte bir oyun alanı deposu .

görüntü açıklamasını buraya girin


3
Bu en temiz ve en iyi çözüm
TrackDave

Yılan çubuğunun boyutunu değiştirdi
William

AppTheme'inizin derlemek için Theme.MaterialComponents'tan miras alması gerektiğini unutmayın
A.Mamode

İçin teşekkürler my_snackbar_background. Onsuz Snackbar daha yuvarlak köşeler çizdi.
CoolMind

Stackoverflow.com/a/62006413/2914140 adresine biraz daha stil ekledim .
CoolMind

17

Kotlin sürümü (bir uzantı ile ):

Bir dosyada (örneğin SnackbarExtension.kt için) bir uzantı oluşturun:

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

Ardından, Aktivitenizde / Parçanızda bunu yapabileceksiniz:

Snackbar
  .make(coordinatorLayout, message, Snackbar.LENGTH_LONG)
  .withColor(YOUR_COLOR)
  .show()

Gerçekten bu yanıta benzeyen, metin renklendirmesini de ekledim: 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) bunu
döndür

13

Körük kodu, mesajın metin rengini değiştirmek için kullanışlıdır.

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

İkinci Yol: Aktivite temasını da değiştirerek rengini değiştirebilirsiniz.


7

Çok geç ama birinin hala yardıma ihtiyacı olması durumunda. İşte çalışma çözümü.

      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

Xamarin android ile çalışırken, ContextCompat.GetColor () 'un Int döndürdüğünü ancak setBackgroundColor ()' un Color türünde bir Parametre beklediğini öğrendim. İşte xamarin android projemde onu nasıl çalıştırdım.

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

Xamarin için 1 View snckView = snackbarview.View;yerine snackbar.getView();hangi mevcut değil ama ParseColorçalışmıyor.
Cfun

@Cfun Sorununuzu biraz daha açıklayabilir misiniz, böylece size yardımcı olabilirim.
SATYAJEET RANJAN

Benim hatam System.Drawing.Color.ParseColoryerine kullandım Android.Graphics.Color.ParseColor. şimdi elimde: "'getstring' adı mevcut bağlamda mevcut değil"
Cfun

@Cfun Bu hatayı bir aktivitede veya bir parçada mı alıyorsunuz yoksa başka bir sınıfta getString () 'i mi arıyorsunuz?
SATYAJEET RANJAN

Onu başka bir Sınıfta arıyorum.
Cfun

3

Küçük bir mutfak dersi hazırladım, böylece uygulama üzerinden kolayca özel renkli atıştırmalıklar yapabileyim.

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

daha sonra, uygulamanın herhangi bir yerinde olduğu gibi kullanmak için:

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


2

Bir Utility sınıfına koyun:

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

Bunun gibi kullanarak:

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

2

Temel olarak, sağlanan çözümlerin bir dezavantajı vardır. Atıştırmalık çubuğunun şeklini değiştirirler ve yarıçapı kaldırırlar.

Şahsen böyle bir şeyi tercih ederim

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

Diğer çözümlerin hiçbiri benim için gerçekten işe yaramadı. Yalnızca Snackbar'ın arka plan rengini ayarlarsam, TextView ve Button altındaki düzen varsayılan renkteydi. TextView'in arka planını ayarlarsam, SnackBar gösterildikten sonra biraz göz kırptı. Ve düğmenin etrafındaki düzen hala varsayılan renkteydi.

Sonunda, benim için en iyi yolun TextView'in ebeveyninin (SnackbarContentLayout) arka plan rengini değiştirmek olduğunu öğrendim. Artık tüm Snackbar düzgün bir şekilde renklendirildi ve ortaya çıktığında yanıp sönmüyor.

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() aynı şekilde çalışıyor.

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

1

SetBackgroundColor () 'un projemde neden bulmadığını bilmiyorum. Bu yüzden bir uzantı işlevi oluşturdum ve şimdi sorun değil.

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

ve buna feryat diyelim

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.