एंड्रॉइड पैकेज में रिसोर्स आईडी से आप ड्रा करने योग्य ऑब्जेक्ट कैसे प्राप्त करते हैं?


156

मुझे एक छवि बटन पर प्रदर्शित करने के लिए एक खींचने योग्य वस्तु प्राप्त करने की आवश्यकता है। क्या एंड्रॉइड से एक ऑब्जेक्ट प्राप्त करने के लिए नीचे दिए गए कोड (या ऐसा कुछ) का उपयोग करने का एक तरीका है। वापस लेने योग्य। * पैकेज?

उदाहरण के लिए अगर drawableId android.R.drawable.ic_delete था

mContext.getResources().getDrawable(drawableId)

जवाबों:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

मैंने यह भी पाया कि एप्लिकेशन संदर्भ का उपयोग करना काम करने लगता है, धन्यवाद।
Blaskovicz

20
एपीआई 22 के रूप में getDrawable(int id)पदावनत है। getDrawable(int id, Resources.Theme theme)इसके बजाय उपयोग करें । विधि getTheme()सहायक होनी चाहिए।
इसहाक ज़ाइस

1
मुझे एक छोटा सा संदेह है। इस कोड में "संसाधन के प्रकार से हटाने योग्य (int) विधि निकाली गई है"। एक एसओ के उत्तर के अनुसार 1. क्या जावा में डिप्रेस्ड तरीकों या कक्षाओं का उपयोग करना गलत है? पदावनत की परिभाषा से: "एक प्रोग्राम तत्व एनोटेट किया गया @ डीप्रेकेटेड वह है जिसे प्रोग्रामर उपयोग करने से हतोत्साहित करते हैं, आमतौर पर क्योंकि यह खतरनाक है, या क्योंकि एक बेहतर विकल्प मौजूद है।" इसके लिए बेहतर विकल्प क्या है।
हत्यारा

107

एपीआई 21 के रूप में , आपको getDrawable(int, Theme)इसके बजाय विधि का उपयोग करना चाहिए getDrawable(int), क्योंकि यह आपको दिए गए drawableकिसी विशेष से जुड़े ऑब्जेक्ट को लाने की अनुमति देता है । कॉलिंग विधि कॉलिंग के बराबर है ।resource IDscreen density/themedeprecated getDrawable(int)getDrawable(int, null)

आपको इसके बजाय समर्थन लाइब्रेरी से निम्न कोड का उपयोग करना चाहिए:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

इस पद्धति का उपयोग करना कॉल करने के बराबर है:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

context.getDrawable(id);के बराबर प्रतीत होता हैresources.getDrawable(id, context.getTheme());
ErickBergmann

यह एक पंक्ति में किया जा सकता है यदि आपके पास समर्थन पुस्तकालय है:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

एपीआई 21 के रूप में, आप भी उपयोग कर सकते हैं:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

के बजाय ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
क्या आप पसंद के लिए आगे स्पष्टीकरण प्रदान कर सकते हैं
Nyandika

3

सबसे अच्छा तरीका है

 button.setBackgroundResource(android.R.drawable.ic_delete);

या ड्रॉबल लेफ्ट के लिए यह और राइट के लिए कुछ ऐसा है आदि।

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

तथा

getResources().getDrawable() अब पदावनत हो गया है


0

एपीआई 21 getDrawable(int id)से पदावनत है। तो अब आपको उपयोग करने की आवश्यकता है

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

लेकिन ऐसा करने का सबसे अच्छा तरीका है: आपको ड्रा करने योग्य और रंग प्राप्त करने के लिए एक सामान्य वर्ग बनाना चाहिए क्योंकि यदि भविष्य में कोई भी चीज बदलती है या खराब होती है तो आपको अपने प्रोजेक्ट में हर जगह बदलने की कोई आवश्यकता नहीं है। आप बस इस विधि में बदलाव करें

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

इस विधि का उपयोग करें जैसे:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

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