प्रोग्राम के लिए बटन टिंट कैसे जोड़ें


120

नए AppCompat लाइब्रेरी में, हम इस तरह से बटन टिंट कर सकते हैं:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/follow"
    android:id="@+id/button_follow"
    android:backgroundTint="@color/blue_100"
    />

मैं बटन के टिंट को अपने कोड में प्रोग्रामेटिक रूप से कैसे सेट कर सकता हूं? मैं मूल रूप से कुछ उपयोगकर्ता इनपुट के आधार पर बटन के एक सशर्त रंग को लागू करने की कोशिश कर रहा हूं।


क्या आपको यकीन है कि Android: बैकग्राउंड प्री-लॉलीपॉप पर काम कर रहा है? मैं दोनों बटन और ApCompatButton के साथ परीक्षण करता हूं, लेकिन पृष्ठभूमि केवल लॉलीपॉप पर काम कर रहा है।
शारज

जवाबों:


162

के अनुसार प्रलेखन से संबंधित विधि android:backgroundTintहै setBackgroundTintList (ColorStateList सूची)

अपडेट करें

कलर स्टेट लिस्ट रिसोर्स कैसे बनाएं, यह जानने के लिए इस लिंक को फॉलो करें ।

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="#your_color_here" />
</selector>

फिर इसका उपयोग करके लोड करें

setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name));

जहां contextInstanceका उदाहरण हैContext


AppCompart का उपयोग कर

btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));

जो एक रंग नहीं है, लेकिन एक ColorStateList है। इसका लाभ कैसे उठाया जाए?
स्टीफन

4
मुझे लगता है कि अब इसे कैसे करना है, धन्यवाद, लेकिन एंड्रॉइड आपको केवल एक रंग मैन्युअल रूप से उपयोग करने की अनुमति क्यों नहीं देगा? मेरे पास मौजूद हर बटन के हर रंग के लिए, मुझे ColorStateList के लिए एक xml बनाना होगा? यह मेरे लिए एक बर्बादी की तरह लगता है
स्टीफन

2
अगर आप AppCompatButton पर कॉल करते हैं, तो setBackgroundTintList को API 21 की जरूरत है।
शारज

29
AppCompat सपोर्ट लाइब्रेरी एक स्थिर सहायक प्रदान करता है: ViewCompat.setBackgroundTintList(View, ColorStateList)जिसका उपयोग API 4. के लिए सभी तरह से किया जा सकता है, लेकिन यह केवल उन विचारों के लिए काम करता है जो लागू होते हैं TintableBackgroundView, उदाहरण के लिए AppCompatButton(सामान्य के बजाय Button)।
जॉन एडम्स

1
अब, ViewCompat.setBackgroundTintList(View, ColorStateList)@Jon Adams ने सुझाव देते हुए प्रयोग किया , क्योंकि View.setSupportButtonTintList RestrictToएनोटेशन के साथ प्रतिबंधित है, इससे भी अधिक समझ में आता है । यहाँ विवरण: developer.android.com/reference/android/support/annotation/…
एलेक्सकॉस्ट

75

आप उपयोग कर सकते हैं

button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));

लेकिन मैं आपको एक समर्थन पुस्तकालय का उपयोग करने योग्य टिनिंग का उपयोग करने की सलाह दूंगा जो कल ही जारी किया गया था:

Drawable drawable = ...;

// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);

// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);

आप इस ब्लॉग पोस्ट में और अधिक पा सकते हैं (अनुभाग "ड्रा करने योग्य टिनिंग देखें")


2
क्या आप उर पद्धति का उपयोग करके टिंट सेट करने के लिए पूर्ण कोड प्रदान कर सकते हैं?
एम। उस्मान खान

सबसे बढ़िया उत्तर...!
गोकुल नाथ केपी

60

लगता है जैसे विचार के पास टिंट प्रबंधन के लिए खुद के मैकेनिक्स हैं, इसलिए बेहतर होगा कि टिंट की सूची बनाई जाए:

ViewCompat.setBackgroundTintList(
    editText, 
    ColorStateList.valueOf(errorColor));

इस तरह से इसका उपयोग करना बेहतर है, इसलिए आपको एपीआई 4 से पीछे की संगतता मिलनी चाहिए!
xarlymg89

सबसे अच्छा समाधान में से एक।
आतिफ अब्बासी

21

एक वास्तविक कोड स्थिति प्रदान करके dimsuz के उत्तर को ठीक से विस्तारित करने में, निम्नलिखित कोड स्निपेट देखें:

    Drawable buttonDrawable = button.getBackground();
    buttonDrawable = DrawableCompat.wrap(buttonDrawable);
    //the color is a direct color int and not a color resource
    DrawableCompat.setTint(buttonDrawable, Color.RED);
    button.setBackground(buttonDrawable);

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


@TruptiNasit खुशी है कि सुनने के लिए।
Shayne3000

मेरे लिए काम किया। धन्यवाद।
वेस्ले फ़्रैंक

1
@wesleyfranks आपका स्वागत है। यह सुनकर खुशी हुई।
Shayne3000

7

क्या आपने कुछ इस तरह की कोशिश की है?

button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100));

ध्यान दें कि getResources () केवल एक गतिविधि में काम करेगा। लेकिन इसे हर संदर्भ पर भी कहा जा सकता है।


आप यहाँ बताए अनुसार एक xml बना सकते हैं: developer.android.com/reference/android/content/res/…
क्रिस के।

getColorStateList को पदावनत प्रतीत होता है।
मेघुरफिन

1
setBackgroundTintList एपीआई स्तर 21 की आवश्यकता प्रतीत
नशे

1
बटन। setBackgroundTintList (ContextCompat.getColorStateList (संदर्भ, R.color.blue)); मेरे लिए काम किया
jesto paul


5

आप DrawableCompat उदाहरण के लिए उपयोग कर सकते हैं

public static Drawable setTint(Drawable drawable, int color) {
    final Drawable newDrawable = DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(newDrawable, color);
    return newDrawable;
}

5

यह आसानी से सामग्री डिजाइन पुस्तकालय से नई सामग्री बटन में संभाला है, पहले, निर्भरता जोड़ें:

implementation 'com.google.android.material:material:1.1.0-alpha07'

फिर अपने XML में, इसे अपने बटन के लिए उपयोग करें:

<com.google.android.material.button.MaterialButton
    android:id="@+id/accept"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/i_accept"
    android:textSize="18sp"
    app:backgroundTint="@color/grayBackground_500" />

और जब आप रंग बदलना चाहते हैं, तो यहां कोटलिन में कोड है, यह पदावनत नहीं है और इसे एंड्रॉइड से पहले इस्तेमाल किया जा सकता है:

accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, 
R.color.colorPrimary, theme))

क्या पाठ टिंट के लिए भी ऐसा ही है?
Android डेवलपर

आप एक बटन के रूप में पाठ का मतलब है और आप पृष्ठभूमि का रंग बदलना चाहते हैं?
अमीन केशवार्ज़ियन

4

जिस तरह से मैं काम करने में कामयाब रहा, उसका उपयोग करके किया गया था CompoundButtonCompat.setButtonTintList(button, colour)

मेरी समझ से यह Android संस्करण की परवाह किए बिना काम करता है।


3

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मैं एक रंग (इंट) मूल्य के आधार पर एक दृश्य के लिए एक जटिल ड्रॉबल पृष्ठभूमि को रंगना चाहता था। मैं कोड का उपयोग करके सफल हुआ:

ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);

जहां रंग एक आवश्यक मूल्य का प्रतिनिधित्व करने वाला रंग है। यह सरल xml ColorStateList का प्रतिनिधित्व करता है:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:color="color here"/>
</selector>

उम्मीद है की यह मदद करेगा।


2
न्यूनतम API स्तर 21 की आवश्यकता
Forsberg

अच्छी तरह से आप बस इस्तेमाल कर सकते हैंColorStateList.valueOf(ColorInt)
user924

2

ImageButton के लिए आप उपयोग कर सकते हैं:

favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

setColorFilter को बटन के लिए परिभाषित नहीं किया गया है
Jérémy

यह ImageButton के लिए है।
सौरभ सिंह

ओह ठीक है, मैं इसके बारे में नहीं जानता था। लेकिन ओपी बटन मांग रहा है। क्या आप इस विवरण के साथ अपने उत्तर को संपादित कर सकते हैं ताकि मैं अपने डाउनवोट को हटा सकूं?
जेरी

2

यदि आप उपयोग कर रहे हैं Kotlinऔर Material Design, आप अपना रंग MaterialButtonइस तरह बदल सकते हैं :

myButton.background.setTintList(ContextCompat.getColorStateList(context, R.color.myColor))

आप MaterialButtonकोड को अधिक पठनीय बनाने के लिए और अपने कोडिंग को थोड़ा अधिक सुविधाजनक बनाने के लिए अपने लिए एक एक्सटेंशन फ़ंक्शन बनाकर इसे और भी बेहतर ढंग से बेहतर बना सकते हैं:

fun MaterialButton.changeColor(color: Int) {
    this.background.setTintList(ContextCompat.getColorStateList(context, color))
}

फिर, आप इस तरह से हर जगह अपने फ़ंक्शन का उपयोग कर सकते हैं:

myButton.changeColor(R.color.myColor)

1

Shayne3000 के जवाब के अलावा आप एक रंग संसाधन (न केवल एक अंतर रंग) का उपयोग कर सकते हैं। कोटलिन संस्करण:

var indicatorViewDrawable = itemHolder.indicatorView.background
indicatorViewDrawable = DrawableCompat.wrap(indicatorViewDrawable)
val color = ResourcesCompat.getColor(context.resources, R.color.AppGreenColor, null) // get your color from resources
DrawableCompat.setTint(indicatorViewDrawable, color)
itemHolder.indicatorView.background = indicatorViewDrawable

0

यहाँ सुझाया गया उत्तर एंड्रॉइड 5.0 पर ठीक से काम नहीं करता है यदि आपकी XML आधारित रंग स्थिति सूची थीम आधारित विशेषताओं का उल्लेख करती है .. उदाहरण के लिए, मेरे पास एक xml रंग राज्य सूची है जैसे:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="?colorPrimary" android:state_enabled="true"/>
    <item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>

Xml से मेरे बैकग्राउंड के रूप में इसका उपयोग करना एंड्रॉइड 5.0 और बाकी सभी चीजों पर ठीक काम करता है। हालाँकि अगर मैं इसे इस तरह कोड में सेट करने की कोशिश करता हूँ:

(यह मत करो)

myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

यह वास्तव में मायने नहीं रखता अगर मैं गतिविधि या बटन के संदर्भ को ContextCompat.getColorStateList () विधि से पास करता हूं, न तो मुझे बटन के भीतर विषय के संबंध में उचित रंग राज्य सूची देगा। ऐसा इसलिए है क्योंकि रंग राज्य सूचियों में थीम विशेषताओं का उपयोग करने में 23 तक का समर्थन नहीं किया गया था और इन्हें हल करने के लिए ContextCompat कुछ विशेष नहीं करता है। इसके बजाय आपको AppCompatResources.getColorStateList () का उपयोग करना चाहिए जो उपकरणों पर अपने स्वयं के संसाधन पार्सिंग / थीम विशेषता रिज़ॉल्यूशन <API 23 करता है।

इसके बजाय, आपको इसका उपयोग करना चाहिए:

myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

TLDR: उपयोग AppCompatResources और -ContextCompat- आप एंड्रॉयड के सभी API संस्करण भर में हल हो गई थीम वाले संसाधनों की आवश्यकता होगी नहीं तो।

विषय पर अधिक जानकारी के लिए, इस लेख को देखें

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