स्नैकबार की पृष्ठभूमि का रंग कैसे बदलें?


101

मैं डायलॉगफ्रैगमेंट में अलर्टडायॉगॉग के पॉजिटिव क्लिक के अंदर स्नैकबार दिखा रहा हूं। यहाँ मेरा कोड स्निपेट है।

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

जैसा कि आप देख सकते हैं कि मेरे स्नैकबर्स की पृष्ठभूमि का रंग सफेद रंग दिखा रहा है

स्नैकबार को डायलॉगफ्रैगमेंट के बारे में बता रहा हूं। मुझे पृष्ठभूमि का रंग काला चाहिए? मैं यह कैसे कर सकता हूँ? मैं DialogFragment में सतर्क लौट रहा हूं। और मैं जिस विषय पर संवाद स्थापित कर रहा हूं, उसका अनुसरण करें

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

यद्यपि मैं संवाद के लिए पृष्ठभूमि का रंग सफेद पर सेट कर रहा हूं, लेकिन पृष्ठभूमि रंग को स्नैकबार पर सेट करके इसे ओवरराइड करना चाहिए।



कोशिश की है कि पहले से ही मेरी मदद नहीं कर रहा ... मैं संवाद खंड से स्नैक बार बुला रहा हूँ + इसमें अलर्टडायॉगॉग और मैं पॉजिटिव बटन पास कर रहा हूँ स्नैकबार को देखने के लिए क्लिक करें
Ajinkya

जवाबों:


171

इस तरह बैकग्राउंड कलर सेट करने की कोशिश करें:

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

यह 100% काम करेगा!


50
आपको करने की आवश्यकता हो सकती हैsnackBarView.getView().setBackgrondColor(ContextCompat.getColor(getActivity(), R.color.BLACK));
jaytj95

2
अगर आपको यह पृष्ठ Google से मिला और उपरोक्त समाधान आपके लिए काम नहीं आया, तो आपको इसके बजाय यह प्रयास करने की आवश्यकता हो सकती है:sbView.setBackgroundColor(getResources().getColor(R.color.BLACK))
modu

@modu नोट जो getResources#getColorएपीआई स्तर 23 ( मार्शमैलो) के बाद से हटा दिया गया है और ContextCompat#getColorइसके बजाय इसका उपयोग किया जाना चाहिए।
एड्रिक

89

आप इसे इस तरह से कर सकते हैं

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
जैसा कि आप देख सकते हैं कि मैंने ठीक ऐसा ही किया है, लेकिन यह काले रंग में नहीं दिख रहा है
Ajinkya

मैंने अपने प्रोजेक्ट में से एक में इसका उपयोग किया है, इसे परीक्षण के लिए गतिविधि में प्रदर्शित करने का प्रयास करें, हो सकता है कि यह संवाद के कारण काम न कर रहा हो
जुबैर अकबर

फिर इसकी गतिविधि पर काम कर रहा हूं लेकिन मैं इसे संवाद के टुकड़े पर चाहता हूं।
अजिंक्य

मुझे लगता है कि यह आपके विचार के कारण है कि आप इसे पारित कर रहे हैं
जुबैर अकबर

20

यदि आप अपने सभी स्नैकबार के लिए पृष्ठभूमि रंग को परिभाषित करना चाहते हैं, तो design_snackbar_background_colorअपने संसाधनों में कहीं न कहीं मूल्य को ओवरराइड करें । उदाहरण के लिए:

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

यह समाधान सबसे साफ और अच्छा है। धन्यवाद!
आलदेव

1
महान काम करता है, बस रंगों में यह छड़ी। Xml और आप सेट कर रहे हैं!
एवी दर्शन

नहीं। मेरे लिए काम नहीं किया। न ही कोई अन्य उपाय किया।
AndroidDev

20

जैसा कि अन्य उत्तरों में से कोई भी एक कस्टम स्टाइल ओवरराइड प्रदान नहीं करता है (कि मैं ऐसा करने के लिए सबसे सुरक्षित अपडेट तरीके में से एक मानता हूं) मैं यहां अपना समाधान पोस्ट करता हूं।

मैं एक समाधान पोस्ट करता हूं जो पहले से ही नए AndroidX( support design 28) थीम को संबोधित करता है ।

बशर्ते कि आपका एप्लिकेशन आपके द्वारा कहे MyAppThemeगए किसी कस्टम का उपयोग करे 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.xmlअपने आवेदन द्वारा उपयोग किए गए विषय को ओवरराइड करें:

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

और अपनी 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>

अद्यतन 2020

जैसा कि उपरोक्त समाधान स्नैकर बेकॉज के गोल कोने को हटाता है पृष्ठभूमि को इस तरह सेट करता है कि आप विरासत स्नैकबार डिज़ाइन का उपयोग करते हैं, यदि आप चाहते हैं कि सामग्री डिजाइन को संरक्षित कर सकें।

  1. यदि आप API 21+ को लक्षित कर रहे हैं

के android:backgroundसाथ बदलेंandroid: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 को लक्षित कर रहे हैं, तो यदि आप API <21 के लिए लीगेसी स्नैकबार का उपयोग करने का निर्णय लेते हैं, तो आप अपने abouve MySnackbarStyleको res / मान -21 / फ़ोल्डर में सेट कर सकते हैं और अपने Res / मान फ़ोल्डर में पिछली - विरासत शैली छोड़ सकते हैं ।

  2. यदि आप API <21 को लक्षित कर रहे हैं और आप चाहते हैं कि स्नैकबार की सामग्री शैली भी इस निम्न एपीआई स्तरों में हो तो आप अपने रेस / मूल्यों में अपने स्नैकबार शैली को बदल सकते हैं :

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

और अपने आधिकारिक रेपो से इस तरह my_snackbar_backgroundसे उधार लें :

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

यहाँ एक खेल का मैदान रेपो है

यहां छवि विवरण दर्ज करें


3
यह सबसे साफ और सबसे अच्छा समाधान है
TrackDave

यह sankbar के आकार को बदल रहा है
विलियम

ध्यान दें कि आपके AppTheme को Theme.MaterialCompords से संकलन करने के लिए विरासत में मिलनी चाहिए
A.Mamode

के लिए धन्यवाद my_snackbar_background। इसके बिना स्नैकबार ने गोल कोनों के साथ आकर्षित किया।
कूलमैन्ड

मैंने stackoverflow.com/a/62006413/2914140 में थोड़ा और स्टाइल जोड़ा ।
कूलमैन्ड

15

कोटलिन संस्करण ( विस्तार के साथ ):

एक एक्सटेंशन में फ़ाइल बनाएं (उदाहरण के लिए SnackbarExtension.kt):

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

आगे, अपनी गतिविधि / फ्रैगमेंट में, आप ऐसा करने में सक्षम होंगे:

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

वास्तव में इस उत्तर की तरह, मैंने टेक्स्ट कलरिंग को भी जोड़ा: मजेदार स्नैकबार.विथकॉर्नर (@ColorInt backgroundColor: Int, @ColorInt textColor: Int): स्नैकबार {this.view.setBsetgroundColor (बैकग्राउंडर) this.view.findViewById <textView> (TextView>) android.support.design.R.id.snackbar_text) .setTextColor (textColor) इसे वापस
लौटाएँ

13

संदेश का रंग बदलने के लिए Bellow कोड उपयोगी है।

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

दूसरा तरीका: आप गतिविधि के विषय को भी बदलकर रंग बदल सकते हैं।


7

बहुत देर हो चुकी है लेकिन मामले में किसी को अभी भी मदद की ज़रूरत है। यहाँ काम कर समाधान है।

      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 के साथ काम करते हुए मुझे पता चला कि ContextCompat.GetColor () Int लौटाता है, लेकिन setBackgroundColor () प्रकार के रंग के एक पैरामीटर की अपेक्षा करता है। तो यहाँ है कि कैसे मैं इसे अपने xamarin Android परियोजना में काम कर रहा हूँ।

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

Xamarin के लिए +1 जिसके View snckView = snackbarview.View;बजाय snackbar.getView();उपलब्ध नहीं है लेकिन ParseColorकाम नहीं कर रहा है।
Cfun

@Cfun क्या आप अपनी समस्या को थोड़ा और समझा सकते हैं, ताकि मैं आपकी मदद कर सकूं।
SATYAJEET RANJAN

मेरा बुरा मैं के System.Drawing.Color.ParseColorबजाय इस्तेमाल किया Android.Graphics.Color.ParseColor। अब मेरे पास है: "नाम 'getstring' वर्तमान संदर्भ में मौजूद नहीं है"
Cfun

@Cfun क्या आप किसी गतिविधि या टुकड़े में यह त्रुटि प्राप्त कर रहे हैं या आप किसी अन्य वर्ग में गेटस्ट्रीमिंग () कॉल कर रहे हैं?
सत्यजीत

मैं इसे किसी और कक्षा में बुला रहा हूं।
Cfun


2

मैं एक छोटे से बर्तन वर्ग बनाया ताकि मैं आसानी से अनुप्रयोग के माध्यम से कस्टम रंग स्नैकबार बना सकते हैं।

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

फिर इसका उपयोग करने के लिए, इस एप्लिकेशन में किसी भी तरह:

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

2

इसे उपयोगिता वर्ग में रखें:

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

इस तरह का उपयोग करना:

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

2

मूल रूप से, जो समाधान प्रदान किए गए थे उनमें एक नुकसान है। वे स्नैकबार के आकार को बदलते हैं और त्रिज्या को हटाते हैं।

व्यक्तिगत रूप से, ऐसा कुछ पसंद करते हैं

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

कोई भी अन्य समाधान वास्तव में मेरे लिए काम नहीं किया। यदि मैंने केवल स्नैकबार की पृष्ठभूमि का रंग सेट किया है, तो टेक्स्टव्यू और बटन के तहत लेआउट डिफ़ॉल्ट रंग में था। अगर मैंने TextView की पृष्ठभूमि सेट की, तो SnackBar दिखाए जाने के बाद यह थोड़ा झपकी ले गया। और बटन के चारों ओर लेआउट अभी भी डिफ़ॉल्ट रंग में था।

अंत में मुझे पता चला कि मेरे लिए सबसे अच्छा तरीका टेक्स्टएव के माता-पिता (स्नैकबार कॉन्टेंटलआउट) की पृष्ठभूमि का रंग बदलना है। अब पूरा स्नैकबार ठीक से रंग गया है और जब यह दिखाई देता है तो यह झपकाता नहीं है।

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() साथ ही काम करता है।

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

1

मुझे पता नहीं क्यों setBackgroundColor () मेरी परियोजना में नहीं मिला। इसलिए मैंने एक एक्सटेंशन फंक्शन बनाया और अब ठीक है।

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

और इसे बलो की तरह बुलाओ

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

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.