Resources.getColor(int id)
विधि मान्य नहीं है।
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
मुझे क्या करना चाहिए?
Resources.getColor(int id)
विधि मान्य नहीं है।
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
मुझे क्या करना चाहिए?
जवाबों:
एंड्रॉइड सपोर्ट लाइब्रेरी 23 से शुरू होकर,
एक नया गेटकोलर () तरीका जोड़ा गया है ContextCompat
।
आधिकारिक जावाडॉक से इसका विवरण:
किसी विशेष संसाधन ID से संबद्ध रंग लौटाता है
एम में शुरू, लौटे रंग निर्दिष्ट प्रसंग के विषय के लिए स्टाइल किया जाएगा।
तो, बस कॉल करें :
ContextCompat.getColor(context, R.color.your_color);
आप ContextCompat.getColor()
GitHub पर स्रोत कोड की जांच कर सकते हैं ।
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
यदि आप विषयों की परवाह करते हैं, तो प्रलेखन निर्दिष्ट करता है कि:
एम में शुरू, लौटे रंग निर्दिष्ट संदर्भ के विषय के लिए स्टाइल किया जाएगा
M
, लौटाया गया रंग निर्दिष्ट कॉन्टेक्स्ट की थीम के लिए स्टाइल किया जाएगा। "
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
है कि जवाब में नहीं डालना चाहिए ।
मैं सिर्फ 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);
एंड्रॉइड मार्शमैलो में कई विधियों को पदावनत किया जाता है।
उदाहरण के लिए, रंग का उपयोग करने के लिए
ContextCompat.getColor(context, R.color.color_name);
साथ ही इसका उपयोग करने योग्य है
ContextCompat.getDrawable(context, R.drawable.drawble_name);
सभी कोटलिन उपयोगकर्ताओं के लिए:
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
कोटलिन में अपने 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
}
}
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
।
यदि आपको संसाधनों की आवश्यकता नहीं है, तो उपयोग करें parseColor(String)
:
Color.parseColor("#cc0066")
यदि आपका वर्तमान मि। एपीआई स्तर 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))
से संसाधन ।
मैं भी निराश हो गया। मेरी जरूरत बहुत सीधी थी। मैं चाहता था कि संसाधनों से एआरजीबी रंग हो, इसलिए मैंने एक सरल स्थिर विधि लिखी।
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;
}