Android getResources ()। GetDrawable () अपग्रेड किया गया API 22


699

नए Android एपीआई 22 getResources().getDrawable()के साथ अब पदावनत हो गया है। अब सबसे अच्छा तरीका केवल उपयोग करना है getDrawable()

किया बदल गया?


क्या आप अपना प्रश्न निर्दिष्ट कर सकते हैं? यह सही है कि getDrawable (int id)वर्ग की विधि Resourcesको पदावनत किया जाता है। अब आपको getDrawable (int id, Resources.Theme theme)नए थीम पैरामीटर के साथ विधि का उपयोग करना चाहिए ।
कोड बंदर

1
ContextCompat.getDrawable (संदर्भ, R.color.color_name)
अशोकचक्रवर्ती नागराजन

आप इस विषय पर मेरे ब्लॉग पोस्ट की जांच कर सकते हैं कि दोनों के बारे में अधिक गहन व्याख्या क्यों की गई Resources#getDrawable(int)और दोनों Resources#getColor(int)को हटा दिया गया।
एलेक्स लॉकवुड

1
Google को प्रत्येक पदावनत समारोह के लिए त्वरित सुधार करना चाहिए। मैंने इसके बारे में एक पोस्ट यहाँ दी: code.google.com/p/android/issues/detail?id=219495
Android डेवलपर

जवाबों:


1027

आपके पास इस विकल्प को सही (और भविष्य के सबूत ) तरीके से संभालने के लिए कुछ विकल्प हैं , जो इस बात पर निर्भर करता है कि आप किस प्रकार का ड्रॉबल लोड कर रहे हैं:


ए) drawables साथ विषय गुण

ContextCompat.getDrawable(getActivity(), R.drawable.name);

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


बी) drawables बिना विषय गुण

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

आप अपने पुराने रास्ते को अस्थिर कर पाएंगे। कृपया ध्यान दें: ResourcesCompat.getDrawable()है नहीं पदावनत!


अतिरिक्त) एक अन्य विषय से विषय विशेषताओं के साथ चित्र बनाता है

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

मेरा एप्लिकेशन सुझाव बी का उपयोग करके क्रैश करता है। यह कॉल करने योग्य ओरिजिनल = रिसोर्सकम्पैट.गेटड्रेसेबल (ctxt.getResources (), iconResId, null) को पसंद नहीं करता है;
फ्रैक्टलबोब

मैं इसे इस तरह घोषित करता हूं: सार्वजनिक स्थैतिक शून्य setImageButtonEnabled (संदर्भ ctxt, बूलियन सक्षम, ImageButton आइटम, int iconResId) {item.setEnabled (सक्षम); ड्रा करने योग्य ओरिजिनल = रिसोर्सकम्पैट.गेटड्राएबल (ctxt.getResources (), iconResId, null); सक्षम चिह्न = सक्षम? originalIcon: ConvertDrawableToGrayScale (ओरिजिनकॉन); item.setImageDrawable (आइकन); } और इसे इस तरह से कॉल करें: Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
फ्रैक्टलबोब

अधिक सटीक रूप से, दुर्घटना इसलिए हो रही है क्योंकि मेरा आइकन एक वेक्टर ड्रॉबल है।
फ्रैक्टलबोब

1
xamarin संस्करण: ResourcesCompat.GetDrawable (संसाधन, Resource.Drawable.name, null);
ब्रायन

मैं आपसे एक और शब्द जोड़ता हूं te ContextCompat.getColor (संदर्भ, रंग) भी आपकी मदद कर सकता है ...
BertKing

746

संपादित करें: अधिक संपूर्ण स्पष्टीकरण के लिए विषय पर मेरी ब्लॉग पोस्ट देखें


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

ContextCompat.getDrawable(context, R.drawable.***)

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

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

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


8
मुझे लगता है कि ओपी वर्ग की getDrawable (int id)पद्धति को भी संदर्भित करता है Context। यह वैसा ही है getResources().getDrawable(id, getTheme());और नए API का भी उपयोग करता है।
कोड बंदर

9
प्रलेखन के अनुसार, उपयोग करने के लिए न्यूनतम एपीआई स्तर 21 आवश्यक है getDrawable(int, Resources.Theme)
प्रिंस

@Prince विधि को एपीआई 21 में जोड़ा गया था, लेकिन इसे एपीआई 22 तक अपदस्थ नहीं किया गया था। :)
एलेक्स लॉकवुड

Android doc Context :: getDrawable (int) विधि का उपयोग करने की भी सिफारिश करता है, लेकिन चूंकि इसे केवल API 21 में पेश किया गया था, ऐसा लगता है कि ContextCompat सबसे अच्छा विकल्प है।
GoRGon

यह उत्तर .svg फ़ाइलों के साथ, API 21 से पुराने संस्करणों में काम नहीं करता है। लाइब्रेरी में एक बग है।
जॉर्ज रॉड्रिग्ज

141

इस पंक्ति को बदलें: getResources().getDrawable(R.drawable.your_drawable)

साथ में ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

संपादित करें

ResourcesCompatअब भी वंचित है। लेकिन आप इसका उपयोग कर सकते हैं:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(यहाँ thisसंदर्भ है)

अधिक जानकारी के लिए इस लिंक का अनुसरण करें: ContextCompat



कृपया इस लिंक को देखें: developer.android.com/reference/android/support/v4/content/… , int)
vincent091

2
यह में कहना नहीं है लिंक है कि ResourcesCompatमान्य नहीं है। यह ठीक काम करना चाहिए।
जैकब आर

अगर मैं
ड्रा करने

29

getResources().getDrawable() एपीआई स्तर 22 में पदावनत किया गया था। अब हमें विषय जोड़ना चाहिए:

getDrawable (int id, Resources.Theme विषय) (एपीआई स्तर 21 में जोड़ा गया)

यह एक उदाहरण है:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

यह एक उदाहरण है कि बाद के संस्करणों के लिए कैसे मान्य किया जाए:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

Build.VERSION_CODES.LOLLIPOP is API 21, तो यह if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)या नहीं होना चाहिए if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? कोई बात नहीं। नीचे से "विधि को एपीआई 21 में जोड़ा गया था, लेकिन एपीआई 22 तक इसे अपदस्थ नहीं किया गया था :)"
मार्क क्रैमर

2

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

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

मेरे लिए वह काम है


प्री लॉलीपॉप पर वेक्टर ड्रॉबल क्रैश लोड करने के लिए एप्लिकेशन संदर्भ का उपयोग करना। इसके लिए कोई फिक्स?
मुथुराज

1
@ मुथुराज मुझे लॉलीपॉप मामले के साथ कोड के लिए अपना परीक्षण याद नहीं है, लेकिन आप इसके बजाय getActivity () या getResources () की कोशिश कर सकते हैं, क्या यह आपके कोड के साथ ठीक है?
डासर बसौनी

मैं MVVM पैटर्न का उपयोग कर रहा हूं और मुझे ViewModels के अंदर ड्रॉबल्स को बढ़ाने की जरूरत है, जिसमें गतिविधि संदर्भ नहीं है। इसमें केवल आवेदन का संदर्भ है। यही मेरा मुद्दा है।
मुथुराज

1

किसी सूचीदृश्य को लोड करने के लिए मैंने सरणी में समस्या को कैसे ठीक किया, इसका एक उदाहरण है, आशा है कि यह मदद करता है।

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

1

इसे इस्तेमाल करे:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}

हालांकि यह कोड इस प्रश्न का उत्तर दे सकता है, कि यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
डोनाल्ड डक


1

getDrawable (int drawable) API स्तर 22 में पदावनत किया गया है। संदर्भ के लिए इस लिंक को देखें ।

अब इस समस्या को हल करने के लिए हमें एक नए कंस्ट्रक्टर को आईडी के साथ पास करना होगा जैसे: -

getDrawable(int id, Resources.Theme theme)

समाधान के लिए इस तरह करें: -

जावा में: -

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

या

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

कोटलिन में: -

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

या

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

आशा है कि यह आपकी मदद करेगा। धन्यवाद


यह ध्यान देने योग्य है, कि getDrawable (DrawableRes int id, Theme विषय) यदि संसाधन नहीं मिला है, तो एक अपवाद फेंक सकते हैं, getDrawable (Context संदर्भ, int id) अशक्त है, इसलिए इसे Drawable के साथ लौटाया जाना चाहिए? कोटलिन में।
शाम


0

अब आपको इस तरह से लागू करने की आवश्यकता है

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

कोड की एकल पंक्ति के बाद पर्याप्त है, सब कुछ ContextCompat.getDrawable द्वारा ध्यान रखेगा

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

कुछ लोगों के लिए जो इस धागे के सुझाव को लागू करने के बाद भी हल करने के लिए इसे प्राप्त करते हैं (मैं इस तरह एक हुआ करता था) इस लाइन को अपने आवेदन वर्ग, ऑनक्रिएट () विधि में जोड़ें

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

जैसा कि यहां और यहां बताया गया है कि कभी-कभी संसाधनों से वैक्टर तक पहुंचने की आवश्यकता होती है, खासकर जब आप मेनू आइटम, आदि के साथ काम कर रहे होते हैं


0

कोटलिन में आप एक्सटेंशन का उपयोग कर सकते हैं

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

फिर उपयोग करें

context.getMyDrawable(R.drawable.my_icon)

-2

Build.VERSION_CODES.LOLLIPOP को अब BuildVersionCodes.ollipop पर बदल दिया जाना चाहिए:

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}

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