रंग संसाधन से रंग-अंतर प्राप्त करें


448

क्या रंग संसाधन से रंग-इंट पाने का कोई तरीका है? मैं संसाधन (R.color.myColor) में परिभाषित एक रंग के व्यक्तिगत लाल, नीले और हरे रंग के घटकों को प्राप्त करने की कोशिश कर रहा हूं ताकि मैं तीन सीकरबरों के मूल्यों को एक विशिष्ट स्तर पर सेट कर सकूं।

जवाबों:


928

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

getResources().getColor(R.color.idname);

कस्टम रंगों को परिभाषित करने के तरीके के बारे में यहां देखें:

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

संपादित करें (1): के बाद से getColor(int id)किया गया है पदावनत अब, इस इस्तेमाल किया जाना चाहिए:

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

(समर्थन पुस्तकालय 23 में जोड़ा गया)

संपादित करें (2):

नीचे दिए गए कोड का उपयोग प्री और पोस्ट मार्शमैलो (एपीआई 23) दोनों के लिए किया जा सकता है

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

7
android.R.color.some_color के बारे में क्या:
ब्लंडेल

17
@ बेल्डेल उह, डन्नो अगर आपको इसकी आवश्यकता है, लेकिन यह android.R.color.some_colorबहुत अधिक काम करता है जैसे: getResources().getColor(android.R.color.holo_blue_bright)(कम से कम, एपीआई 17 पर)
एटलम

30
getColor () अब पदावनत है, आप उपयोग कर सकते हैं: ContextCompat.getColor (संदर्भ, R.color.your_color);
रिकार्डो

2
मुझे लगता है कि आप वह नहीं हैं जिसने संपादन किया है, लेकिन इसमें क्या अंतर है ContextCompatऔर ResourcesCompat? यदि कोई व्यावहारिक अंतर नहीं है, तो यह कम भ्रामक होगा यदि आपने उनमें से एक को अपने उत्तर से हटा दिया।
सुरगाच

14
Google को उस भयानक ऐप कॉम्पैक्ट लाइब्रेरी के लिए पूरी तरह से अच्छे कार्य को चित्रित करने की आवश्यकता क्यों महसूस होती है। यह दोनों बेकार है।
एंड्रयू एस

116

नए एंड्रॉइड सपोर्ट लाइब्रेरी (और इस अपडेट) के आधार पर , अब आपको कॉल करना चाहिए:

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

प्रलेखन के अनुसार :

public int getColor (int id)

इस विधि को एपीआई स्तर 23 में पदावनत किया गया था । इसके बजाय getColor (int, Theme) का उपयोग करें

यह इसके लिए एक ही समाधान है getResources().getColorStateList(id):

आपको इसे इस तरह बदलना होगा:

ContextCompat.getColorStateList(getContext(),id);

EDIT 2019

ThemeOverlayनिकटतम दृश्य के संदर्भ का उपयोग करने के बारे में :

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

तो इस तरह से आपको अपने ThemeOverlay के आधार पर सही रंग मिलता है।

विशेष रूप से आवश्यक है जब एक ही गतिविधि में आप विभिन्न विषयों का उपयोग करते हैं, जैसे कि अंधेरे / प्रकाश विषय। यदि आप थीम्स और स्टाइल्स के बारे में अधिक समझना चाहते हैं तो इस बात का सुझाव दिया जाता है: स्टाइल के साथ थीम विकसित करना

निक बुचर - Droidcon बर्लिन - स्टाइल के साथ थीम विकसित करना


10
उन लोगों के लिए जो नई विधि में विषय के रूप में भरने के लिए सोच रहे हैं, Themeउन्हें अशक्त के रूप में पारित किया जा सकता है, इसलिए कॉल करें getColor(R.color.my_color, null)कि क्या आप अनिश्चित हैं कि किस विषय में पास होना है।
w3bshark

हम्म ... यह वही है जो हर कोई कहता है, लेकिन मैं इसे काम करने के लिए नहीं कर सकता। क्या मुझे संदर्भ को इनिशियलाइज़ करना है? वर्तमान में मुझे "प्रतीक 'का संदर्भ नहीं मिल रहा है"
कोल्डुना

यह सुनिश्चित करने के लिए कि आप इसे सही कर रहे हैं, गतिविधि के onCreate के अंदर इसे कॉल करने का प्रयास करें, संदर्भ प्राप्त करने के लिए आपको getContext () या "यह" कॉल करने की आवश्यकता है
Ultimo_m

35

अपने रंग को परिभाषित करें

मान / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

रंग int प्राप्त करें और इसे सेट करें

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

यह सभी देखें


1
क्या आप केवल या getResources()में उपयोग कर सकते हैं ? ActivityFragment
जैपनीगोलिका

2
@Zapnologica, इसgetResources() गतिविधि के उत्तरों को गतिविधि या फ्रैगमेंट के बाहर के विचारों के लिए देखें ।
सूर्याग

1
@Zapnologica नहीं। getResources()कॉन्‍टेक्‍ट को लागू करने वाली किसी भी चीज पर एक सार्वजनिक एपीआई के रूप में भी उपलब्ध है और व्यूज पर भी।
ataulm

7

सर्वश्रेष्ठ दृष्टिकोण

@ जवाब के रूप में, रंग प्राप्त करने के लिए अच्छा तरीका है

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

या जब आप getResources()विधि तक नहीं पहुँचते हैं तो नीचे दिए गए तरीके का उपयोग करें ।

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

मैं क्या कर रहा हूँ

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

अपने ऐप में कहीं भी उपयोग करना सबसे सरल है! यहाँ तक कि Util क्लास या किसी भी क्लास में जहाँ आपके पास Context या getResource नहीं है ()

समस्या (जब आपके पास संदर्भ नहीं है)

जब आपकी Contextपहुंच नहीं होती है , तो अपनी Utilकक्षा में एक विधि की तरह ।

कॉनटेक्स्ट के बिना विधि नीचे मान लें।

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

अब आप Contextइस पद्धति में एक पैरामीटर के रूप में पास होंगे और उपयोग करेंगेgetResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

तो यहाँ एक बोनस अद्वितीय समाधान है जिसके द्वारा आप संसाधनों को कहीं से भी एक्सेस कर सकते हैं Util classResourcesअपनी Applicationकक्षा में जोड़ें या मौजूद न होने पर एक बनाएँ।

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

अपने manifest.xml <applicationटैग में नाम फ़ील्ड जोड़ें । (यदि पहले से नहीं जोड़ा गया है)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

अब आप जाने के लिए अच्छे हैं। ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);अनुप्रयोग में कहीं भी उपयोग करें ।


5

मैंने उपयोग करने के लिए अद्यतन किया, ContextCompat.getColor(context, R.color.your_color);लेकिन कभी-कभी (कुछ उपकरणों / Android संस्करणों पर। मुझे यकीन नहीं है) जो NullPointerExcepiton का कारण बनता है।

इसलिए इसे सभी उपकरणों / संस्करणों पर काम करने के लिए, मैं इसे करने के पुराने तरीके पर वापस आता हूं, एक अशक्त सूचक के मामले में।

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

सभी मामलों में पुराने संस्करण का उपयोग क्यों न करें, या यदि आप वैसे भी संस्करण की जाँच कर रहे हैं, Resources.getColor(int, Theme)तो यदि आप कर सकते हैं तो नए एपीआई का उपयोग करें ? आपको रनटाइम अपवादों को नहीं पकड़ना चाहिए।
अताउल्म

बस ओसीडी मुझे लगता है। ContextCompat, मुझे ऐसा करने का भविष्य प्रमाण तरीका लगता है, और इसलिए यह सही तरीका है। इसलिए मेरा दृष्टिकोण है, इसे सही तरीके से करें। और अगर वह विफल हो जाता है (पुराने उपकरणों पर या जो भी), तो इसे पुराने तरीके से करें। मुझे रनटाइम पर अपवाद क्यों नहीं पकड़ने चाहिए?
नौजचीपी

1

एक अन्य उपयोग-मामले के बारे में अधिक जानकारी के लिए जो खोज परिणामों में इस प्रश्न को समझने में मदद कर सकता है, मैं अल्फा को अपने संसाधनों में परिभाषित रंग पर लागू करना चाहता था।

@ Sat के सही उत्तर का उपयोग करना:

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

1

एक आसान तरीका मिला जो काम करता है:

Color.parseColor(getString(R.color.idname);

दिलचस्प है, एहसास नहीं था कि आप इस तरह से एक स्ट्रिंग के रूप में रंग प्राप्त कर सकते हैं। मुझे नहीं लगता कि यह आसान है, लेकिन यह दिलचस्प है
ul

0

गैर-गतिविधि वर्ग से रंगों तक पहुंचना मुश्किल हो सकता है। मेरे द्वारा पाया गया विकल्पों में से एक उपयोग कर रहा था enumenumबहुत लचीलापन प्रदान करता है।

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);


  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}


0

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

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

यदि आप नीचे एपीआई स्तर चाहते हैं 23, तो बस इसका उपयोग करें:

textView.setTextColor(getResources().getColor(R.color.green));

लेकिन ध्यान दें कि getResources().getColor()एपीआई स्तर में अपदस्थ किया गया है 23। उस मामले में ऊपर से बदलें:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat : में सुविधाओं तक पहुँचने के लिए सहायकContext

यदि आप चाहें, तो आप SDK_INTनीचे की तरह बाधा डाल सकते हैं:

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

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

गतिविधि में

ContextCompat.getColor(actvityname.this, R.color.your_color);

टुकड़े में

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

उदाहरण के लिए:

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