यदि मुझे इसका नाम पता है तो मुझे किसी छवि की संसाधन आईडी कैसे मिलेगी?


133

यदि मुझे इसका नाम पता है (Android में) तो मुझे किसी छवि की संसाधन आईडी कैसे मिलेगी?


अगर आप कोटलिन के साथ करना चाहते हैं , तो देखें: stackoverflow.com/a/52568692/1631967
अमीनोग्राफी

जवाबों:


269

कुछ इस तरह के साथ:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
धन्यवाद, जिसने मुझे एक simliar समस्या का हल खोजने में मदद की! मैं getResources().getIdentifier(name, "id", getPackageName());एक इमेजबटन की आईडी प्राप्त करने के लिए उपयोग करूँगा (जैसा कि आप R.id.name के साथ करेंगे)।
Select0r

42
ध्यान दें कि
ड्रा

1
वास्तव में चर में क्या जाता है name? मैं एक बटन की आईडी ढूंढना चाहता हूं जिसका संदर्भ मुझे पता है, मेरे मामले में यह हैbutton1
जॉन वॉटसन

1
getResource()और getPackageName()त्रुटि दिखा रहा है। cannot resolve method
सर्जन बरई

@ सुरजन बरई, getResource()और getPackageName()गतिविधि से विधियां हैं।
बर्गा

29

आप यह भी आज़मा सकते हैं:

try {
    Class res = R.drawable.class;
    Field field = res.getField("drawableName");
    int drawableId = field.getInt(null);
}
catch (Exception e) {
    Log.e("MyTag", "Failure to get drawable id.", e);
}

मैंने नीचे URL से इस स्रोत कोड की प्रतिलिपि बनाई है। इस पृष्ठ में किए गए परीक्षणों के आधार पर, यह getIdentifier () से 5 गुना तेज है। मैंने इसे अधिक आसान और उपयोग में आसान भी पाया। आशा है कि यह आपकी मदद करता है।

लिंक: Android में डायनामिक रूप से पुनर्प्राप्त संसाधन


2
यह तेजी से हो सकता है, लेकिन मैंने पाया कि अगर आप प्रॉपर का उपयोग करते हैं तो यह आपको मुसीबत में डाल सकता है यह कम से कम मेरे लिए
प्रहरी

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

अब मुझे समझ में आया :) आपका मतलब है कि अनुकूलन के दौरान परिवर्तन योग्य परिवर्तन और संसाधन इस पद्धति का उपयोग करके नहीं मिल सकते हैं, अगर मैं सही हूं? :)
वीएसबी

1
@VSB: यदि आपकी अंतिम टिप्पणी पॉल लैमर्ट्स्मा की एक टिप्पणी है जो तुरंत ऊपर है: नहीं, तो उसका मतलब है कि प्रोगार्ड को नहीं पता कि यह संसाधन का संदर्भ है, और इसलिए संसाधन को हटा सकते हैं, यह मानते हुए कि इसका उपयोग नहीं किया गया है।
टूलमेकर

एक बार जब आप xxxxhdpi, xxhdpi इत्यादि का उपयोग करते हैं, तो यह विधि कम उपयोगी हो जाती है
कोई कहीं पर

11

एक सार्वजनिक प्रणाली संसाधन के लिए उदाहरण:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

चेतावनी

दूसरा तरीका यह है कि Android.R.drawable क्लास के लिए डॉक्यूमेंटेशन देखें ।


1
@ मायलाद आपका क्या मतलब है?
नाका

इसका मतलब है कि मैं कोड में संसाधनों से भ्रमित हूं और मैं इसका उपयोग गैर-गतिविधि वर्ग
मिलादाद

1
@Milaaaad यह विधि सिस्टम संसाधनों के लिए है। वे संदर्भ पर निर्भर नहीं हैं।
naXa

10

संसाधन ID प्राप्त करने के लिए आप इस फ़ंक्शन का उपयोग कर सकते हैं:

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


इसलिए यदि आप एक ड्रा करने योग्य संसाधन आईडी प्राप्त करना चाहते हैं , तो आप इस तरह से विधि को कॉल कर सकते हैं:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(या एक टुकड़े से):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


एक के लिए स्ट्रिंग संसाधन ID आप इसे इस तरह कॉल कर सकते हैं:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

आदि...


सावधान : यह एक RuntimeException फेंकता है अगर यह संसाधन ID खोजने में विफल रहता है। उत्पादन में ठीक से ठीक होना सुनिश्चित करें।

इसे पढ़ें


4
मुझे लगता है कि आपको इससे दूर करने की आवश्यकता staticहै, अन्यथा getResources()काम नहीं करेगा।
रिचर्ड ले मेसियर

@ रिचर्ड ली मेसुरियर, क्या आप बता सकते हैं कि क्यों? धन्यवाद।
वीर

1
@ लियो.हेन जिस समय मैंने वह टिप्पणी की, वह Contextउपलब्ध नहीं थी। फिक्स दूर करने के लिए या तो था staticऔर यह एक में ले जाते हैं Context(उदाहरण के लिए Activityया Application); या वैकल्पिक निर्धारण जोनाथन ने अपने संपादन में किया, जो Contextकि विधि में पास करना है।
रिचर्ड ले मेसुरियर

1
@ रिचर्ड ली मेसुरियर, मैंने अभी-अभी एडिट हिस्ट्री चेक की, यह वैसा ही है जैसा आपने कहा, इतने सालों के बाद आपके विनम्र उत्तर के लिए धन्यवाद :)
वीर

0

एक अन्य परिदृश्य जो मुझे मिला।

स्ट्रिंग छविनाम = "हैलो" और फिर जब इसे पहले तर्क के रूप में getIdentifier फ़ंक्शन में पास किया जाता है, तो यह स्ट्रिंग नाल समाप्ति के साथ नाम पारित करेगा और हमेशा शून्य पर लौटेगा। इस छवि को पास करें। नामकरण (0, imageName.length () - 1)

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