getColor (int id) एंड्रॉइड 6.0 मार्शमैलो पर अपग्रेड किया गया (एपीआई 23)


718

Resources.getColor(int id)विधि मान्य नहीं है।

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

मुझे क्या करना चाहिए?


26
ContextCompat.getColor (संदर्भ, R.color.color_name) का उपयोग करें
अशोकचक्रवर्ती नागराजन

ऊपर उल्लिखित इस पद्धति के साथ: getColor (संदर्भ, R.color.your_color); यह स्पष्ट नहीं है कि "संदर्भ" कैसे प्राप्त किया जाए। यह सिर्फ मेरे मामले में संदर्भ रखकर काम नहीं करेगा, Android स्टूडियो 3.2। मुझे यह काम मेरे लिए लगता है। .setTextColor (Color.RED)।
हैरी

जवाबों:


1347

एंड्रॉइड सपोर्ट लाइब्रेरी 23 से शुरू होकर,
एक नया गेटकोलर () तरीका जोड़ा गया है ContextCompat

आधिकारिक जावाडॉक से इसका विवरण:

किसी विशेष संसाधन ID से संबद्ध रंग लौटाता है

एम में शुरू, लौटे रंग निर्दिष्ट प्रसंग के विषय के लिए स्टाइल किया जाएगा।


तो, बस कॉल करें :

ContextCompat.getColor(context, R.color.your_color);


आप ContextCompat.getColor() GitHub पर स्रोत कोड की जांच कर सकते हैं ।


1
यह समाधान की तरह दिखता है, लेकिन जब हमें एक त्रुटि मिलती है, तो हमें क्या करना चाहिए "संसाधन आईडी के बजाय हल किए गए रंग को पास करना चाहिए"? जहां तक ​​मैं बता सकता हूं कि शायद यह इसलिए है क्योंकि लिंट सपोर्ट लाइब्रेरी के नए एपीआई को मान्यता नहीं देता है, इसलिए शायद सिर्फ एक एनोटेशन @SuppressWarnings ("रिसोर्सएस्कॉर्नर") जोड़ना है? मुझे यह बहुत पसंद नहीं है।
स्टेन

1
हाय @Stan, क्या आप कृपया उस विधि कॉल के साथ कोड स्निपेट प्रदान कर सकते हैं जो "रिसोर्सएस्कलर" लिंट को ट्रिगर करता है?
आरा

"int color = ContextCompat.getColor (यह, R.color.orange);" और फिर "स्पैन = नया फ़ोरग्राउंडरक्लोरस्पैन (रंग);"। शब्द जो लाल रंग में रेखांकित किया गया है, वह "रंग" है, जहां मैं इसे "नया फ़ोरग्राउंडरक्लोरस्पैन ()" पास करता हूं।
स्टेन

1
@MonicaLabbao ओह ... क्षमा करें, मुझे आपकी टिप्पणी गलत लगी! :)
अरकस १५'१६ को

3
ContextCompatApi23 इस मार्क त्रुटि आप संदर्भ ContextCompat supossed
Webserveis

498

tl; डॉ:

ContextCompat.getColor(context, R.color.my_color)

स्पष्टीकरण:

आपको ContextCompat.getColor () का उपयोग करने की आवश्यकता होगी , जो समर्थन V4 लाइब्रेरी का हिस्सा है (यह सभी पिछले एपीआई के लिए काम करेगा)।

ContextCompat.getColor(context, R.color.my_color)

यदि आप पहले से समर्थन पुस्तकालय का उपयोग नहीं करते हैं, तो आपको dependenciesअपने ऐप के अंदर सरणी में निम्नलिखित पंक्ति को जोड़ना होगा build.gradle(ध्यान दें: यदि आप पहले से ही ऐपकॉम (V7) लाइब्रेरी का उपयोग करते हैं तो यह वैकल्पिक है ):

compile 'com.android.support:support-v4:23.0.0' # or any version above

यदि आप विषयों की परवाह करते हैं, तो प्रलेखन निर्दिष्ट करता है कि:

एम में शुरू, लौटे रंग निर्दिष्ट संदर्भ के विषय के लिए स्टाइल किया जाएगा


4
यह सही उत्तर के रूप में चयनित होना चाहिए। क्योंकि एंड्रॉइड डॉक्स के दिए गए लिंक में, यह कहता है " शुरू करना M, लौटाया गया रंग निर्दिष्ट कॉन्टेक्स्ट की थीम के लिए स्टाइल किया जाएगा। "
बग्स हैप्पन

1
संकलित 'com.android.support:appcompat-v7:23.0.1'
जी ओ'रिल्ला

@G ओ'रिला जैसा कि आप प्रलेखन में देख सकते हैं, ContextCompatवर्ग SupportV4 से आता है। AppcompatV7 भी कार्य करता है क्योंकि यह SupportV4 पर निर्भर करता है। वे पर कहते हैं कि के रूप में समर्थन लाइब्रेरी प्रलेखन , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.। तो यह समझ में आता AppcompatV7है कि जवाब में नहीं डालना चाहिए ।
मेल्विन

1
धन्यवाद @ मेल्विन, यहाँ मेरा उदाहरण है अगर उपयोग करें: int colorTwitterBlue = ContextCompat.getColor (यह, R.color.color_twitter_blue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_NEGATIVE) .setTextColor (colorTwitterBlue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_POSITIVE) .setTextColor (colorTwitterBlue);
लारा रफ़ल कोल्स

1
@Melvin। वास्तव में इसका क्या अर्थ है 'निर्दिष्ट संदर्भ के लिए रंग को स्टाइल किया जाएगा'। लगता है कि एक ही विषय के आधार पर एक ही रंग आईडी के लिए विभिन्न रंगों को परिभाषित कर सकते हैं। यह वास्तव में कैसे किया जाता है?
रॉबर्टो क्यूबा

47

मैं सिर्फ getColor के लिए समर्थन पुस्तकालय को शामिल नहीं करना चाहता , इसलिए मैं कुछ का उपयोग कर रहा हूं

public static int getColorWrapper(Context context, int id) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return context.getColor(id);
    } else {
        //noinspection deprecation
        return context.getResources().getColor(id);
    }
}

मुझे लगता है कि कोड को बस ठीक काम करना चाहिए, और पदावनत getColor<<23 से गायब नहीं हो सकता।

और यह मैं कोटलिन में उपयोग कर रहा हूं:

/**
 * Returns a color associated with a particular resource ID.
 *
 * Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
 */
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
    if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);

4
स्रोत कोड को देखते हुए, यह ठीक उसी तरह है जैसे समर्थन पुस्तकालय करता है। मैं API> = 21 को लक्षित करता हूं, इसलिए मैं इन कुछ लाइनों के लिए एक पूर्ण जार शामिल नहीं करना चाहता। ध्यान दें कि आप ऐन्ड्रॉइड कॉल के ऊपर "// noinspection deprecation" जोड़कर एंड्रॉइड स्टूडियो में चेतावनी को दबा सकते हैं। और एक गतिविधि संदर्भ का उपयोग करें, न कि अनुप्रयोग संदर्भ, या आप विषय की जानकारी खो सकते हैं।
personne3000

2
यह सही उत्तर होना चाहिए, हालांकि समर्थन पुस्तकालय भविष्य के प्रमाण का अधिक विकल्प हो सकता है, मैं इस बात से सहमत हूं कि यदि यह एकमात्र कारण है जिसमें आप समर्थन पुस्तकालय शामिल करते हैं, तो आप इन पंक्तियों के जोड़े को बेहतर तरीके से शामिल कर सकते हैं।
एंथनोनिमोरी

30

एंड्रॉइड मार्शमैलो में कई विधियों को पदावनत किया जाता है।

उदाहरण के लिए, रंग का उपयोग करने के लिए

ContextCompat.getColor(context, R.color.color_name);

साथ ही इसका उपयोग करने योग्य है

ContextCompat.getDrawable(context, R.drawable.drawble_name);

3
चर संदर्भ कहां से आता है? क्या मुझे इसे शुरू करना है? मैं इसे काम नहीं कर सकता। मेरे लिए ऐसा लगता है कि एंड्रोइंड के लिए एक लंबा रास्ता तय करना है; यह मेरे मन को उड़ा देता है कि मैं एक xml संसाधन से एफई रंग प्राप्त करने के लिए कितना संघर्ष कर रहा हूँ !! वाह
कोल्डटुना

29

सभी कोटलिन उपयोगकर्ताओं के लिए:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}

वास्तव में होना चाहिए val color = ContextCompat.getColor(context, R.color.colorPrimary)। चर "यह" कुछ भी हो सकता है, लेकिन इसे एक संदर्भ होने की आवश्यकता है ।
स्कॉट बिग्स

itइस मामले में है context, क्योंकि मैं context?.let {जांच करने के लिए उपयोग करता हूं कि contextक्या अशक्त नहीं है। फ़ंक्शन getColor()केवल एक गैर-शून्य संदर्भ को स्वीकार करता है। इसके बारे में letऔर अधिक पढ़ें और इसका उपयोग कैसे करें: kotlinlang.org/docs/reference/scope-functions.html#let
पॉल स्पाइसेबर्गर

4

कोटलिन में अपने RecyclerView में

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
        textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
        textViewcolor.text = t.name
    }
}

1

Android समर्थन लाइब्रेरी से getColor(Resources, int, Theme)विधि का उपयोग करें ResourcesCompat

int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);

मुझे लगता है getColor(Context, int)कि ContextCompatजब से आप इसके बारे में पूछते हैं , तो यह आपके प्रश्न को बेहतर ढंग से दर्शाता है Resources। एपीआई स्तर 23 से पहले, विषय लागू नहीं किया जाएगा और विधि के माध्यम से कॉल करता है, getColor(int)लेकिन आपके पास पदावनत चेतावनी नहीं होगी। थीम भी हो सकती है null


1
यदि आप थीम तर्क के रूप में अशक्त हो जाते हैं, तो दिए गए रंग को वर्तमान थीम के लिए स्टाइल नहीं किया जाएगा। तो यह गलत हो सकता है।
अरक्स


1

यदि आपका वर्तमान मि। एपीआई स्तर 23 है, आप बस का उपयोग कर सकते हैंgetColor() जैसे हम स्ट्रिंग संसाधनों को प्राप्त करने के लिए उपयोग कर रहे हैं getString():

//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()

आप 23 से नीचे एपीआई स्तर के लिए बाधा डाल सकते हैं:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

लेकिन इसे सरल रखने के लिए, आप नीचे दिए गए उत्तर की तरह कर सकते हैं:

textView.setTextColor(ContextCompat.getColor(context, R.color.green))

से संसाधन

से ContextCompat AndroidX

से ContextCompat समर्थन


0

मैं भी निराश हो गया। मेरी जरूरत बहुत सीधी थी। मैं चाहता था कि संसाधनों से एआरजीबी रंग हो, इसलिए मैंने एक सरल स्थिर विधि लिखी।

protected static int getARGBColor(Context c, int resId)
        throws Resources.NotFoundException {

    TypedValue color = new TypedValue();
    try {
        c.getResources().getValue(resId, color, true);
    }
    catch (Resources.NotFoundException e) {
        throw(new Resources.NotFoundException(
                  String.format("Failed to find color for resourse id 0x%08x",
                                resId)));
    }
    if (color.type != TYPE_INT_COLOR_ARGB8) {
        throw(new Resources.NotFoundException(
                  String.format(
                      "Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
                      resId, color.type))
        );
    }
    return color.data;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.