लॉलीपॉप की पृष्ठभूमि का एक बटन पर कोई प्रभाव नहीं है


83

मेरे पास मेरी गतिविधि में एक बटन है, और मैं चाहूंगा कि मेरे विषय का उच्चारण रंग हो। हमारे अपने ड्रॉबल बनाने के बजाय जैसे हमें प्री-लॉलीपॉप करना था, स्वाभाविक रूप से मैं नई backgroundTintविशेषता का उपयोग करना चाहूंगा ।

<Button
    android:id="@+id/btnAddCode"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/accent"
    android:text="@string/addressInfo_edit_addCode" />

दुर्भाग्य से इसका कोई प्रभाव नहीं है, बटन ग्रे रहता है।

मैंने विभिन्न मूल्यों के लिए कोशिश की backgroundTintMode, जो कुछ भी नहीं बदले।

मैंने इसे अपनी गतिविधि में प्रोग्रामेटिक रूप से करने की कोशिश की, जिसमें कुछ भी बदलाव नहीं हुआ।

addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
     getResources().getColorStateList(R.color.accent));

मेरे टिंट की अनदेखी क्यों की गई है?

संपादित करें: बस स्पष्ट करने के लिए, मैं वास्तव में लॉलीपॉप डिवाइस पर परीक्षण कर रहा हूं। अन्य विजेट (जैसे EditText) सही ढंग से और स्वचालित रूप से रंगा हुआ है।


3
यह एक बग है जिसे भविष्य के रिलीज के लिए तय किया गया है, लेकिन स्वीकृत समाधान एपीआई 21+ पर काम करेगा।
अलानव

जवाबों:


18

एपीआई 27 के माध्यम से एपीआई 19 पर परीक्षण किया गया

<?xml version="1.0" encoding="utf-8"?>
  <android.support.v7.widget.AppCompatButton 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/retry"
    android:textColor="@android:color/white"
    app:backgroundTint="@android:color/holo_red_dark" />

उत्पादन के रूप में उत्पादन -

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


इसे स्वीकृत उत्तर के रूप में चिह्नित करना क्योंकि कई वर्षों के बाद, मेरा मानना ​​है कि यह वर्तमान में ऐसा करने का आधिकारिक (और सर्वोत्तम) तरीका है। (मामूली विवरण: मुझे पूरा यकीन है कि ज्यादातर मामलों में आप बस AppCompatButton के बजाय बटन का उपयोग कर सकते हैं और यह अभी भी काम करेगा)।
BoD

118

बुरी ख़बरें

जैसे BoD कहता है, लॉलीपॉप 5.0 (एपीआई स्तर 21) में एक बटन की पृष्ठभूमि को टिंट करना अर्थहीन है।

अच्छी खबर

लॉलीपॉप 5.1 (एपीआई स्तर 22) btn_mtrl_default_shape.xml (अन्य फ़ाइलों के बीच) में परिवर्तन करके इसे ठीक कर दिया गया लगता है: https://android.googlesource.com/platform/frameworks-base/+/6dfa60f33ca6018959ebff1efde82db7d2d2d2d2d2d

बड़ी खुशखबरी

नए समर्थन पुस्तकालय (संस्करण 22.1+) पार्श्व-संगत tinting समर्थन जोड़ता सहित घटकों, की बहुत सारी करने के लिए AppCompatButton !

दुर्भाग्य से, android:backgroundTintसंपत्ति अभी भी काम नहीं करती है (शायद मैं कुछ गलत कर रहा हूं) - इसलिए आपको ColorStateListकोड का उपयोग करना होगा setSupportBackgroundTintList()android:backgroundTintभविष्य में समर्थित देखना वास्तव में अच्छा होगा। अद्यतन : Marcio Granzotto ने टिप्पणी की कि AppCompatButton app:backgroundTintपर काम करता है! ध्यान दें कि यह एप्लिकेशन / लाइब्रेरी में app:नहीं है android:, क्योंकि यह नहीं है ।

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <AppCompatButton
        android:id="@+id/mybutton"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="Testing, testing"
        app:backgroundTint="#ff00ff"/>

</LinearLayout>

यदि आप इसे से विरासत में देते हैं, तो आपकी गतिविधि AppCompatButtonसामान्य के बजाय स्वचालित रूप से बढ़ जाएगी ।ButtonAppCompatActivity

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
        ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
        v.setSupportBackgroundTintList(csl);
    }
}

आप निश्चित रूप ColorStateListसे एक रंग संसाधन से प्राप्त करना चाहिए , लेकिन मैं आलसी था, इसलिए ...

ओह, और Theme.AppCompatविषयों में से किसी एक पर अपने ऐप थीम को आधार बनाना न भूलें , या फिर कॉम्पिटिशन व्यू बहुत, बहुत दुखद होगा;);

इसने 2.3.7 (जिंजरब्रेड MR1) और 5.0 (लॉलीपॉप 'क्लासिक') दोनों पर काम किया।


1
बस कुछ और जानकारी जोड़ी - सबसे महत्वपूर्ण बात, अब दूसरे दिन जारी की गई समर्थन लाइब्रेरी के नए संस्करण (22.1) के साथ बटन टिनिंग को प्राप्त करना संभव है!
स्निल्ड डॉकला

8
आप colorButtonNormalAppCompat 22.1.1 (केवल बटन के लिए थीम सेट करना) के साथ उपयोग कर सकते हैं , यह मेरे लिए 4.4.4 और 5.1 पर काम करता है।
हिनादिम

2
किसी भी विचार कैसे TextView के लिए एक ही बात सेट करने के लिए?
एंड्रॉइड डेवलपर

8
इसके बजाय new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});आप अधिक संक्षेप में लिख सकते हैं ColorStateList.valueOf(0xffffcc00);
अश्कण सरलाक

5
आप app के साथ android.support.v7.widget.AppCompatButton का उपयोग कर सकते हैं: पृष्ठभूमि पर xml
Marcio Granzotto

30

ऐसा लगता है कि रिपल ड्रिबल को टिन करना अर्थहीन है (और एक बटन की डिफॉल्ट बैकग्राउंड एक रिपल ड्रिबल है)।

वास्तव में, प्लेटफ़ॉर्म के डिफ़ॉल्ट बटन को देखने योग्य के बाद, मुझे ऐसा करने का "सही" तरीका मिला:। आपको इसे अपनी थीम में परिभाषित करना होगा:

    <item name="android:colorButtonNormal">@color/accent</item>

(बेशक यह केवल 21+ स्तर के लिए है।)

चेतावनी: चूंकि यह एक विषय में परिभाषित किया गया है, इसलिए यह सभी बटन के लिए दिए गए रंग का उपयोग करेगा (इस विषय का उपयोग करके गतिविधियों में कम से कम सभी बटन।)

एक बोनस के रूप में, आप इसे परिभाषित करके लहर के रंग को भी बदल सकते हैं:

    <item name="android:colorControlHighlight">@color/accent_ripple</item>

colorControlHighlightहालांकि बहुत सारे अन्य विजेट बदल जाएंगे। खुशी है कि आपने इसे पूरा कर लिया है।
नटारियो

5
आप इसे ओवरले थीम (जैसे कोई मूल विषय और केवल एक विशेषता परिभाषित नहीं) और Android - थीम विशेषता का उपयोग करके एक व्यक्तिगत दृश्य में लागू कर सकते हैं।
अलानव

1
फिर यह एपीआई 22 और ऊपर के लिए कैसे तय किया गया है? इसके अलावा यह "बग" केवल एपीआई 21 (नेक्सस 5, गैलेक्सी एस 3 सहित) के कुछ उपकरणों में
निहित है

22

एंड्रॉइड 5.0.x पर टिनिंग से संबंधित मुद्दों को हल करने के लिए मैं कुछ इस तरह का उपयोग करता हूं:

public static void setButtonTint(Button button, ColorStateList tint) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) {
        ((AppCompatButton) button).setSupportBackgroundTintList(tint);
    } else {
        ViewCompat.setBackgroundTintList(button, tint);
    }
}

यह केवल API 21 और अन्य सभी मामलों के लिए ViewCompat एक के लिए समर्थन पद्धति का उपयोग करता है।


@ मार्को का उपयोग करें:if (view instanceof TintableBackgroundView) { ((TintableBackgroundView) view).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(view, tint); }
chessdork

यह पूर्व लॉलीपॉप उपकरणों पर एक इमेजबटन के साथ काम नहीं करता है।
टॉब्स्को 42

जब AppCompatButton.setSupportBackgroundTintList () AppCompatButton.setSupportBackgroundTintList केवल एक ही पुस्तकालय समूह के भीतर (ग्रुप = com.android.support) से कहा जा सकता है का उपयोग करते हुए मैं ने एक बत्ती चेतावनी मिलती है
starkej2

इसने मेरे लिए काम किया लेकिन मुझे शर्तों को पलटना पड़ा।
रॉड्रिगो वेनानिसो

"केवल एक ही पुस्तकालय समूह (groupId = com.android.support" के भीतर से यह चेतावनी क्यों दी जा सकती है?
नेग्रे

22

मैं आमतौर पर पोर्टरडफ का उपयोग करके इसे गतिशील रूप से करता हूं:

mbutton = (Button) findViewById(R.id.mybutton);
mbutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY);

आप यहां विभिन्न सम्मिश्रण मोड और अच्छे उदाहरण देख सकते हैं


1
मैंने PorterDuff.Mode.SRC का उपयोग किया है और यह पूरी तरह से काम करता है
francisco_ssb

अच्छी तरह से काम। मेरे मामले में मैं एपीआई 17 पर टिनिंग प्रभाव का उपयोग करना चाहता था, इससे मुझे मदद मिली।
ashishdhiman2007

2
यह स्वीकृत उत्तर होना चाहिए। एपीआई 20 पर काम करने की पुष्टि करें।
हार्ड

19

app:backgroundTintइसके बजाय बस का उपयोग करें android:backgroundTint, टिंट लॉलीपॉप के नीचे प्रभावी होगा। इसका कारण AppCompatButton या AppCompatTextView में ऑटो चेंज बटन या टेक्स्ट व्यू का AppCompatActivityउपयोग AppCompatViewInflaterकरना है, फिर app:backgroundTintप्रभावी होना चाहिए।

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

अपने प्रोजेक्ट में मैंने इसका इस्तेमाल किया, इसने काम किया।


9

मुझे लगता है कि आपको काम android:backgroundकरने के लिए तैयार होना चाहिए android:backgroundTint

अधिक सटीक होने के लिए, मेरा अनुमान है कि आप backgroundTintसामग्री थीम से डिफ़ॉल्ट बटन पृष्ठभूमि नहीं कर सकते हैं , जिसे ए के रूप में परिभाषित किया गया है RippleDrawable


1
मेरे विचार में तुम सही हो। वास्तव में मुझे जो चाहिए वह करने के लिए "सही" तरीका मिला (मेरा उत्तर देखें)।
BoD

3

Google https://code.google.com/p/android/issues/detail?id=201873 पर इसी तरह की समस्या बताई गई थी

लेकिन एंड्रॉइड सपोर्ट लाइब्रेरी की रिलीज़ के बाद, संशोधन 23.2.1 (मार्च 2016) इस बग को हल कर दिया गया है।

समस्या: FloatingActionButton.setBackgroundTintList (@Nullable ColorStateList टिंट) अब पृष्ठभूमि का रंग नहीं बदलती

समर्थन लाइब्रेरी अद्यतन करें Android Support Library to 23.2.1

उपयोग डिजाइन समर्थन पुस्तकालय (23.2.1) और appcompatwidgets नीचे के रूप में

पूर्व लॉलीपॉप उपकरणों के लिए सामग्री डिजाइन :

AppCompat (उर्फ ActionBarCompat) जिंजरब्रेड पर चलने वाले उपकरणों के लिए Android 4.0 ActionBar API के एक बैकपोर्ट के रूप में शुरू हुआ, जो बैकपोर्ट कार्यान्वयन और फ्रेमवर्क कार्यान्वयन के शीर्ष पर एक आम एपीआई परत प्रदान करता है। AppCompat v21 एक एपीआई और फीचर-सेट देता है जो एंड्रॉइड 5.0 के साथ अद्यतित है


Android सहायता लाइब्रेरी 22.1 :

AppCompat का उपयोग करते समय स्वचालित रूप से टिंट विजेट की क्षमता आपके पूरे ऐप में मजबूत ब्रांडिंग और स्थिरता रखने में अविश्वसनीय रूप से सहायक है। यह स्वचालित रूप से किया जाता है जब लेआउट को फुलाया जाता है - AppCompatButton के साथ बटन की जगह, AppCompatTextView के साथ TextView, आदि यह सुनिश्चित करने के लिए कि प्रत्येक टिनटिंग का समर्थन कर सकता है। इस रिलीज़ में, उन टिंट जागरूक विगेट्स अब सार्वजनिक रूप से उपलब्ध हैं, जिससे आपको टिनिंग समर्थन रखने की अनुमति मिलती है, भले ही आपको समर्थित विजेट में से किसी एक को उप-वर्ग करने की आवश्यकता हो।



2

यदि हम समर्थन लाइब्रेरी के स्रोत कोड को देखते हैं, तो हम देखते हैं कि यह सामान्य रूप से ज्ञात बटन है, लेकिन अगर हम अपने बटन के आकार को बदलते हैं (मेरे पास गोल बटन है) टिंट एपि = 21 में ठीक काम नहीं करता है। हम यह भी देख सकते हैं कि TintManager सार्वजनिक वर्ग (appcompat-v7: 23.1.1) बन गया है, इसलिए हम वर्तमान विषय के लिए डिफ़ॉल्ट बटन आकार (जो 5.0 में ठीक रंगा हुआ है) से ColorStateList ले सकते हैं (इसलिए हमें सरणी बनाने की आवश्यकता नहीं है रंगों का):

    Context c = ...; // activity
    AppCompatButton ab = ...; // your button
    // works ok in 22+:
    if (Build.VERSION.SDK_INT <= 21) {
        // default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape":
        // ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape);
        // Appcompat 23.2 change:
        ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape);
        ab.setSupportBackgroundTintList(tint);
        }

चूँकि Appcompat 23.2 के बाद से उन्होंने क्लास बदल दी (हालाँकि इसकी जनता!) TintManager -> AppCompatDrawableManager कोड लगभग एक जैसा ही रहता है
Pavel Biryukov

WTF ... getTintList को जनता से बदलकर अब संरक्षित कर दिया गया है? (प्रतिबिंब का उपयोग करने की आवश्यकता है :)
पावेल बिरुकोव

0

क्योंकि विशेषता backgroundTintका उपयोग केवल API स्तर 21 और उच्चतर में किया जाता है


मुझे लगता है कि, और मैं वास्तव में लॉलीपॉप डिवाइस पर परीक्षण कर रहा हूं। मैं इसे स्पष्ट करने के लिए प्रश्न को अपडेट करूंगा।
BoD

0

अवगत रहें, पुनरावर्तनीय अधिकांश अद्यतन किए गए कार्य इस बग का कारण बन सकते हैं।

यह आज्ञा

  sendBtnView.setBackgroundTintList(colorState)

अतीत में पूरी तरह से काम किया है लेकिन मेरे लिए काम करना बंद करो। शोध के बाद यह पता चलता है कि वह कारण है जो कि निर्भरता में जोड़ा गया था:

  compile 'com.android.support:recyclerview-v7:+'

इसलिए मैंने इसे 23.02.1 में बदलने की कोशिश की क्योंकि यहाँ अमित वाघेला के पद की सिफारिश की गई थी। मैं बदल गया

  compile  'com.android.support:recyclerview-v7:23.02.1'

लेकिन ग्रेडेल एरर ने कहा कि recyclerview lib में यह वर्जन (23.02.1) नहीं है (ग्रेडेल इसे Jcenter raw.github या repo में नहीं खोज सका)।

फिर, क्योंकि मैं जानता था कि setBackgroundTintList कमांड अतीत में संस्करण 22.02.0 के साथ अच्छी तरह से काम करने के लिए इस्तेमाल किया गया था 'अन्य सभी लिबास में मेरे पास निर्भरता है। इसलिए मैं इसे बदल देता हूं:

compile   'com.android.support:recyclerview-v7:22.02.0'

और अब यह फिर से काम करता है।


0

मुझे यकीन नहीं है कि यह सिफारिश की गई है लेकिन आप यह कोशिश कर सकते हैं:

Drawable newDrawable = mBtnAction.getBackground();  // obtain Bg drawable from the button as a new drawable
DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor());  //set it's tint
mBtnAction.setBackground(newDrawable);  //apply back to button

एक सामान्य अर्थ में यह काम करता है। कोशिश की ViewCompatलेकिन यह ठीक से काम नहीं करता है।



0

यदि आप androidx का उपयोग कर रहे हैं तो दोनों उपसर्गों को जोड़ रहे हैं और न कि उपसर्गित संस्करण हल किए गए मुद्दे को एंड्रॉइड 5.1 पर।

<style name="Button_Primary">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:backgroundTint">@color/button_primary_selector</item>
    <item name="backgroundTint">@color/button_primary_selector</item><!--needed for android 5-->
</style>

button_primary चयनकर्ता colorनिम्नलिखित सामग्री वाले फ़ोल्डर में है:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:local="http://schemas.android.com/apk/res-auto">
    <item android:state_enabled="true" android:color="@android:color/holo_blue_dark" />
    <item android:state_enabled="false" android:color="@android:color/darker_gray" />
</selector>

और इसे नियमित बटन पर लागू करें AppCompatActivity

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