एंड्रॉइड के अलावा किसी और चीज के लिए लाइब्रेरी स्नैकबार टेक्स्ट कलर को सपोर्ट कैसे सेट करें: टेक्स्टकॉल?


94

इसलिए मैंने डिज़ाइन सपोर्ट लाइब्रेरी में नए स्नैकबार का उपयोग करना शुरू कर दिया है, लेकिन मैंने पाया कि जब आप अपनी थीम में "एंड्रॉइड: टेक्स्ट कलर" को परिभाषित करते हैं, तो यह स्नैकबार के टेक्स्ट रंग पर लागू होता है। यह स्पष्ट रूप से एक समस्या है अगर आपका प्राथमिक पाठ रंग गहरा है।

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

क्या किसी को इसके चारों ओर एक रास्ता पता है या मेरे पाठ को कैसे रंग देना चाहिए, इसके लिए सलाह है?

EDIT जनवरी 2017: (उत्तर-उत्तर)

जबकि नीचे दी गई समस्या को ठीक करने के लिए कुछ कस्टम समाधान हैं, शायद स्नैकबार्स को थीम का सही तरीका प्रदान करना अच्छा है।

सबसे पहले, आपको संभवतः android:textColorअपने विषयों में परिभाषित नहीं करना चाहिए (जब तक कि आपको वास्तव में विषय का उपयोग करने की गुंजाइश नहीं पता है)। यह मूल रूप से आपके विषय से जुड़ने वाले प्रत्येक दृश्य का पाठ रंग सेट करता है। यदि आप अपने विचारों में पाठ रंगों को परिभाषित करना चाहते हैं जो डिफ़ॉल्ट नहीं हैं, तो android:primaryTextColorअपने कस्टम दृश्यों में उस विशेषता का उपयोग करें और संदर्भ दें।

हालाँकि, विषयों को लागू करने के लिए Snackbar, कृपया इस गुणवत्ता मार्गदर्शिका को किसी तृतीय पक्ष सामग्री दस्तावेज़ से संदर्भित करें: http://www.materialdoc.com/snackbar/ (प्रोग्राम थीम के कार्यान्वयन का पालन करें ताकि यह xml शैली पर निर्भर न हो)

सन्दर्भ के लिए:

// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);

// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));

// get snackbar view
View snackbarView = snackbar.getView();

// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;  
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);  
textView.setTextColor(getResources().getColor(R.color.indigo));

// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);  

(आप अपने स्वयं के कस्टम Snackbarलेआउट भी बना सकते हैं, ऊपर दिए गए लिंक को देखें। ऐसा करें यदि यह विधि बहुत अधिक हैकई महसूस करती है और आप अपने कस्टम स्नैकबार को संभावित समर्थन लाइब्रेरी अपडेट के माध्यम से अंतिम रूप देना चाहते हैं तो एक निश्चित विश्वसनीय तरीका चाहते हैं)।

और वैकल्पिक रूप से, आपकी समस्या को हल करने के लिए समान और शायद तेज़ उत्तर के लिए नीचे दिए गए उत्तर देखें।


समाधान के लिए धन्यवाद! संपत्ति वास्तव में कहा जाता हैandroid:textColorPrimary
muetzenflo

इस व्यापक स्पष्टीकरण के लिए धन्यवाद।
बग्स

"आप शायद एंड्रॉइड को परिभाषित नहीं कर रहे होंगे: टेक्स्टकॉल आपके विषयों में बिल्कुल ..." मेरे लिए यह महत्वपूर्ण था, धन्यवाद!
टायलर

जवाबों:


41

मुझे पता है कि इसका उत्तर पहले ही दिया जा चुका है लेकिन मुझे जो सबसे आसान तरीका मिला वह सीधे Html.fromHtmlतरीके और fontटैग का उपयोग कर बना था

Snackbar.make(view, 
       Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()

3
मैं इस समाधान को पसंद करता हूं क्योंकि यह सिंगल लाइन है।
लहिरू चंदिमा

1
यह उस प्रश्न का वास्तविक समाधान नहीं है। का प्रयोग करें: snackbar.setActionTextColor (Color.WHITE) .show ();
अहमदुल्ला सैकत

वहाँ है / Snackbar में एक बग रंग कुछ भी नहीं किया था सेटिंग है। इस तरह से कोई फर्क नहीं पड़ता है, लेकिन दूसरों के लिए इष्टतम समाधान नहीं हो सकता है।
JPM

इसके लिए एपीआई स्तर> 24 की आवश्यकता होती है।
फ्रैंक

171

मैंने यह पाया कि एंड्रॉइड डिज़ाइन सपोर्ट लाइब्रेरी की नई विशेषताएं क्या हैं और इसके स्नैकबार का उपयोग कैसे करें?

स्नैकबार में टेक्स्ट का रंग बदलने के लिए इसने मेरे लिए काम किया।

Snackbar snack = Snackbar.make(view, R.string.message, Snackbar.LENGTH_LONG);
View view = snack.getView();
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
snack.show();



अद्यतन: ANDROIDX: जैसा कि टिप्पणियों में बताया गया है, नए AndroidX समर्थन लाइब्रेरी के साथ, स्नैकबार टेक्स्ट व्यू के आईडी को खोजने के लिए कोड:

TextView tv = view.findViewById(com.google.android.material.R.id.snackbar_text);
tv.setTextColor(ContextCompat.getColor(requireContext(), R.color.someColor))

2
बस किसी और के लिए एक स्नैकबार के पाठ के आकार को बदलने का तरीका खोज रहा है, तो यह है!
Janis Peisenieks

2
FYI करें, आप snackbar_actionइसके बजाय का उपयोग करके क्रिया पाठ के साथ भी कर सकते हैं snackbar_text। एक उदाहरण के लिए इस उत्तर को देखें: stackoverflow.com/a/36800101/293280
जोशुआ पिंटर

7
यह सबसे अच्छी तरह से हैक है - जब समर्थन लाइब्रेरी के भविष्य के रिलीज़ में android.support.design.R.id.snackbar_text की आईडी बदल जाती है तो क्या होता है? क्या किसी प्रकार की डिफ़ॉल्ट स्नैकबार शैली नहीं है जिसे स्टाइल.एक्सएमएल में ओवरराइड किया जा सकता है?
at डिस्कडेव

7
वह आईडी वास्तव में समर्थन पुस्तकालय के भविष्य के रिलीज में बदल गया था, मुझे अब एक अशक्त सूचक मिल रहा है।
CaptainForge

3
अपडेट - androidx के साथ, आईडी अब इस प्रकार है:snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
dblackker

15

हैकिंग android.support.design.R.id.snackbar_textनाजुक है, ऐसा करने के लिए एक बेहतर या कम हैसी तरीका:

String snackText = getResources().getString(YOUR_RESOURCE_ID);
SpannableStringBuilder ssb = new SpannableStringBuilder()
    .append(snackText);
ssb.setSpan(
    new ForegroundColorSpan(Color.WHITE),
    0,
    snackText.length(),
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Snackbar.make(
        getView(),
        ssb,
        Snackbar.LENGTH_SHORT)
        .show();

15

अपनी परियोजनाओं में इस कोटलिन एक्सट्रैक्शन फंक्शन का उपयोग करता हूं:

fun Snackbar.setTextColor(color: Int): Snackbar {
    val tv = view.findViewById(android.support.design.R.id.snackbar_text) as TextView
    tv.setTextColor(color)

    return this
}

आप जैसे उपयोग की उम्मीद करेंगे:

Snackbar.make (देखें, R.string.your_string, Snackbar.LENGTH_LONG) .setTextColor (Color.WHITE) .show ()।


कोटलिन बाहर निकालने के तरीकों का सरल उपयोग प्यार! ;-)
पैट्रिक कुइजपर्स

12
com.google.android.material.R.id.snackbar_textयदि आप AndroidX में माइग्रेट करते हैं तो उपयोग करें ।
ऋषभ Dec६

14

ठीक है, इसलिए मैंने इसे मूल रूप से पाठ के रंगों को करने के तरीके से पुनर्गठित किया।

मेरी प्रकाश विषय में, मैं सेट android:textColorPrimaryकरने के लिए normal dark textमैं चाहता था, और मैं सेट android:textColorकरने के लिए white

मैंने अपने सभी पाठ दृश्य और बटन अपडेट किए हैं android:textColor="?android:attr/textColorPrimary".

इसलिए क्योंकि स्नैकबार ड्रॉ होता है textColor, मैं सिर्फ अपने दूसरे टेक्स्ट को सेट करता हूं textColorPrimary

EDIT JANUARY 2017: ---------------------------------------------- ------

इसलिए जैसा कि टिप्पणियां कहती हैं, और जैसा कि ऊपर संपादित मूल प्रश्न में कहा गया है, आपको संभवतः android:textColorअपने विषयों में परिभाषित नहीं करना चाहिए , क्योंकि इससे विषय के अंदर हर दृश्य का पाठ रंग बदल जाता है।


मैंने अभी-अभी यह कार्य पूरा किया है, पिताजी, कुछ समय लगा! हालाँकि, मुझे अपनी प्राचीन वरीयताएँ गतिविधि के लिए नीचे "m vai" विधि का उपयोग करने की आवश्यकता थी (वरीयताओं का उपयोग करके। xml)। मुझे लगता है कि यह मेरे ऐप की स्टाइल को और अधिक सही ढंग से थीम पर आधारित छोड़ दिया है जो अच्छा है। +1
ओशनलाइफ

1
एक अच्छा समाधान नहीं IMO, मैं अपने वास्तविक विषय को टेक्स्टव्यू के लिए रखना चाहता हूं और सिर्फ snakbar टेक्स्ट का रंग बदल देता हूं ...
issamux

1
आप android:textColorअपने विषय में बिल्कुल भी परिभाषित नहीं करेंगे । यह एक शैली की विशेषता है TextView। यदि आप इसे अपने विषय में परिभाषित करते हैं, तो आप XML के प्रत्येक पाठ रंग को ओवरराइड करते हैं TextViewया Buttonइसका पाठ रंग निर्दिष्ट नहीं करते हैं। यह स्नैकबार संदेश भी होता है जो सामान्य रूप से अपने डार्क थीम ओवरले से रंग लेता है ।
यूजेन पिंचेक

12

एक दृष्टिकोण स्पैन का उपयोग करना है:

final ForegroundColorSpan whiteSpan = new ForegroundColorSpan(ContextCompat.getColor(this, android.R.color.white));
SpannableStringBuilder snackbarText = new SpannableStringBuilder("Hello, I'm white!");
snackbarText.setSpan(whiteSpan, 0, snackbarText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);

Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG)
                .show();

स्पैन के साथ आप एक स्नैकबार के अंदर कई रंग और स्टाइल भी जोड़ सकते हैं। यहाँ एक अच्छा गाइड है:

https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/


9

यदि आप स्नैकबार पर टेक्स्ट के रंग बदलने के com.google.android.material.R.id.snackbar_textबजाय androidX उपयोग के android.support.design.R.id.snackbar_textलिए माइग्रेट हुए हैं।


यू मेडल के लायक है।
फ्रैंक

@ फ्रैंक 17, यहां कई टिप्पणियों में इसका उल्लेख किया गया था।
कूलमैन्ड

6

एकमात्र तरीका जो मैं देख रहा हूं वह getView()अपने बच्चे के माध्यम से साइकिल चलाना और उपयोग करना है । मुझे नहीं पता कि यह काम करने जा रहा है या नहीं और यह जितना बुरा दिखता है। मुझे उम्मीद है कि वे जल्द ही इस मुद्दे के बारे में कुछ एपीआई जोड़ देंगे।

Snackbar snack = Snackbar.make(...);
ViewGroup group = (ViewGroup) snack.getView();
for (int i = 0; i < group.getChildCount(); i++) {
    View v = group.getChildAt(i);
    if (v instanceof TextView) {
        TextView t = (TextView) v;
        t.setTextColor(...)
    }
}
snack.show();


2

यह तब होता है जब मुझे कस्टम रंगों की आवश्यकता होती है

    @NonNull
    public static Snackbar makeSnackbar(@NonNull View layout, @NonNull CharSequence  text, int duration, int backgroundColor, int textColor/*, int actionTextColor*/){
        Snackbar snackBarView = Snackbar.make(layout, text, duration);
        snackBarView.getView().setBackgroundColor(backgroundColor);
        //snackBarView.setActionTextColor(actionTextColor);
        TextView tv = (TextView) snackBarView.getView().findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(textColor);
        return snackBarView;
    }

और भस्म:

CustomView.makeSnackbar(view, "Hello", Snackbar.LENGTH_LONG, Color.YELLOW,Color.CYAN).setAction("DO IT", myAction).show();

2

मैंने अपनी थीम बदल दी

Theme.AppCompat.Light.NoActionBar

सेवा

Theme.AppCompat.NoActionBar 

यह काम किया। प्रकाश या अन्य विषय के बजाय सरल विषय का उपयोग करने की कोशिश करें।


2

यदि आप Snackbar में TextView को आईडी द्वारा ढूंढने के साथ गंदे और हैकी समाधान का उपयोग करने का निर्णय लेते हैं और आप पहले से ही androidx में चले गए हैं, तो यहां कोड है:

val textViewId = com.google.android.material.R.id.snackbar_text
val snackbar = Snackbar.make(view, "Text", Snackbar.LENGTH_SHORT)
val textView = snackbar.view.findViewById(textViewId) as TextView
textView.setTextColor(Color.WHITE)


1

आईडी द्वारा मेरे लिए काम नहीं किया तो मुझे एक और समाधान मिला:

Snackbar snackbar = Snackbar.make(view, text, duration);//just ordinary creation

ViewGroup snackbarView = (ViewGroup) snackbar.getView();
SnackbarContentLayout contentLayout = (SnackbarContentLayout) snackbarView.getChildAt(0);
TextView tvText = contentLayout.getMessageView();
tvText.setTextColor(/*your color here*/);

//set another colors, show, etc

1

Snackbarसामग्री घटक लाइब्रेरी में शामिल का उपयोग करें और लागू करें

  • setTextColor पाठ रंग को परिभाषित करने के लिए
  • setActionTextColorक्रिया द्वारा प्रयुक्त पाठ रंग को परिभाषित करने के लिए। आप एक रंग या एक रंग चयनकर्ता का उपयोग कर सकते हैं
  • setBackgroundTint स्नैकबार की पृष्ठभूमि का रंग परिभाषित करने के लिए

कुछ इस तरह:

Snackbar snackbar = Snackbar.make(view, "My custom Snackbar", Snackbar.LENGTH_LONG);        
snackbar.setTextColor(ContextCompat.getColor(this,R.color.xxxxx));
snackbar.setActionTextColor(ContextCompat.getColor(this,R.color.my_selector));
snackbar.setBackgroundTint(ContextCompat.getColor(this,R.color.xxxx));
snackbar.show();

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


0

मेरे पास एक सरल कोड है जो स्नैकबार के दोनों टेक्स्टव्यू का एक उदाहरण प्राप्त करने में मदद करेगा, इसके बाद आप उन सभी तरीकों को कॉल कर सकते हैं जो टेक्स्टव्यू पर लागू होते हैं।

Snackbar snackbar = Snackbar.make( ... )    // Create Snack bar


snackbar.setActionTextColor(getResources().getColor(R.color.white));  //if you directly want to apply the color to Action Text

TextView snackbarActionTextView = (TextView) snackbar.getView().findViewById( android.support.design.R.id.snackbar_action );

snackbarActionTextView.setTextColor(Color.RED);  //This is another way of doing it

snackbarActionTextView.setTypeface(snackbarActionTextView.getTypeface(), Typeface.BOLD);

//Below Code is to modify the Text in Snack bar
TextView snackbarTextView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
snackbarTextView.setTextSize( 16 );
snackbarTextView.setTextColor(getResources().getColor(R.color.white));

0

बस अपना कीमती विकास समय बचाने के लिए, यहाँ मैं जिस स्थैतिक विधि का उपयोग कर रहा हूँ:

public static void snack(View view, String message) {
    if (!TextUtils.isEmpty(message)) {
        Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT);
        snackbar.getView().setBackgroundColor(Color.YELLOW);
        TextView tv =  snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); //snackbar_text
        tv.setTextColor(Color.BLACK);
        snackbar.show();
    }
}

यह इस तरह दिखता है:

काले पाठ के साथ पीले स्नैकबार


0

यदि आप कोटलिन में हैं , तो आप एक एक्सटेंशन बना सकते हैं:

fun Snackbar.withTextColor(color: Int): Snackbar {
    val tv = this.view.findViewById(android.support.design.R.id.snackbar_text) as TextView
    tv.setTextColor(color)
    return this
}

उपयोग :

yourSnackBar.withTextColor(Color.WHITE).show()

एक ही जवाब मेरा answer
रिचर्ड

0

नए AndroidX Jitpack घटकों के अनुसार

implementation 'com.google.android.material:material:1.0.0'

इस एक्सटेंशन का उपयोग करें जो मैंने बनाया था

inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG,
 f: Snackbar.() -> Unit) {
val snack = Snackbar.make(this, message, length)
snack.f()
snack.show()
}

fun Snackbar.action(action: String, actionColor: Int? = null, textColor: Int? = null, listener: (View) -> Unit) {
setAction(action, listener)
actionColor?.let {
    setActionTextColor(it)
    }
textColor?.let {
    this.view.findViewById<TextView>(R.id.snackbar_text).setTextColor(it)
    }
}

इसे इस तरह इस्तेमाल करें

btn_login.snack(
        getString(R.string.fields_empty_login),
        ContextCompat.getColor(this@LoginActivity, R.color.whiteColor)
    ) {
        action(getString(R.string.text_ok), ContextCompat.getColor(this@LoginActivity, R.color.gray_300),ContextCompat.getColor(this@LoginActivity, R.color.yellow_400)) {
            this@snack.dismiss()
        }
    }

0

इस में इस प्रकार की समस्या का समाधान करने के लिए अपने समाधान नहीं है androidxका उपयोग करते हुएkotlin

 fun showSnackBar(message: String) {
        mContent?.let {
            val snackbar = Snackbar.make(it, message, Snackbar.LENGTH_LONG)
            val snackbarView = snackbar.view
            val tv = snackbarView.findViewById<TextView>(R.id.snackbar_text)
            tv.setTextColor(Color.WHITE) //change the color of text
            tv.maxLines = 3 //specify the limit of text line
            snackbar.duration = BaseTransientBottomBar.LENGTH_SHORT //specify the duraction of text message
            snackbar.show()
        }
    }

आपको नीचे जैसे विधि के mContentअंदर आरंभ करने की आवश्यकता हैonViewCreated

var mContent: View? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mContent = view
    }

0

वर्तमान में (जनवरी 2020) के साथ com.google.android.material:material:1.2.0और शायद यह भी1.1.0

निश्चित रूप से इन शैलियों को ओवरराइड करने का सबसे अच्छा तरीका है:

<item name="snackbarStyle">@style/Widget.MaterialComponents.Snackbar</item>
<item name="snackbarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Snackbar</item>
<item name="snackbarTextViewStyle">@style/Widget.MaterialComponents.Snackbar.TextView</item>

यदि आप .Bridgeकिसी कारण से, किसी विषय वस्तु का उपयोग करते हैं , तो इनमें से कोई भी शैली परिभाषित नहीं है। इसलिए स्नैकर इन शैलियों के बिना कुछ विरासत लेआउट का उपयोग करेगा।

मैंने स्रोत कोड में पाया कि दोनों को परिभाषित किया जाना चाहिए snackbarButtonStyleऔर snackbarTextViewStyleअन्यथा इसका उपयोग नहीं किया जाएगा।


-1

मैंने भी इसी समस्या पर ध्यान दिया। यहाँ उत्तर के लिए धन्यवाद, मैंने एक छोटा वर्ग बनाया है, जो इस समस्या को और आसानी से हल करने में मदद कर सकता है, बस इसे प्रतिस्थापित करके:

Snackbar.make(view, "Error", Snackbar.LENGTH_LONG).show();

इसके साथ:

Snackbar2.make(view, "Error", Snackbar.LENGTH_LONG).show();

यहाँ मेरी कक्षा है:

public class Snackbar2 {
static public Snackbar make(View view, int resid, int duration){
    Snackbar result = Snackbar.make(view, resid, duration);
    process(result);
    return result;
}
static public Snackbar make(View view, String text, int duration){
    Snackbar result = Snackbar.make(view, text, duration);
    process(result);
    return result;
}
static private void process(Snackbar snackbar){
    try {
        View view1= snackbar.getView();

        TextView tv = (TextView) view1.findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(Color.WHITE);

    }catch (Exception ex)
    {
        //inform about error
        ex.printStackTrace();
    }
}

}


1
यह एक हैक है, और स्थिर होने के लिए विभिन्न समर्थन पुस्तकालय विचारों की आईडी पर निर्भर करता है। मैं हर कीमत पर इस समाधान से बचूंगा।
१५:१५
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.