एंड्रॉइड, स्ट्रिंग से रिसोर्स आईडी प्राप्त कर रहा है?


158

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

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

R.drawable.icon

मुझे इस की पूर्णांक आईडी प्राप्त करने की आवश्यकता है, लेकिन मुझे स्ट्रिंग "आइकन" तक भी पहुंचने की आवश्यकता है।

यह बेहतर होगा यदि मुझे विधि को पास करना होगा "आइकन" स्ट्रिंग।


क्या आंतरिक संग्रहण में सहेजी गई फ़ाइलों की getId के समान है? मुझे समस्या है क्योंकि मुझे अपनी गैलरी के स्थानों के बजाय आईडी की सरणी की आपूर्ति करनी चाहिए (सोचा कि यह एडॉप्टर है) .. धन्यवाद
Ewoks

@ ईवोक: उनके पास आंतरिक भंडारण पर आईडी नहीं है। वे केवल छवियां हैं, यदि कुछ भी आपको उन्हें इमेज ऑब्जेक्ट्स के एक समूह में लोड करने और पास करने की आवश्यकता है, तो आप एक नया प्रश्न शुरू करना चाहते हैं।
हामिद

जवाबों:


171

@EboMike: मुझे नहीं पता था कि Resources.getIdentifier()अस्तित्व में है।

अपनी परियोजनाओं में मैंने ऐसा करने के लिए निम्नलिखित कोड का उपयोग किया है:

public static int getResId(String resName, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

इसका उपयोग R.drawable.iconसंसाधन पूर्णांक मान के मान के लिए इस तरह किया जाएगा

int resID = getResId("icon", R.drawable.class); // or other resource class

मुझे बस एक ब्लॉग पोस्ट मिली, जो कहती है कि Resources.getIdentifier()जैसे मैंने किया था वैसा ही परावर्तन का उपयोग करने से धीमा है। इसे देखें


8
@ मैकार्से: वर्तमान में, getIdentifier()दो प्रतिबिंब लुकअप करना है। ऊपर दिए गए आपके उदाहरण में, getIdentifier()पाने के लिए प्रतिबिंब का उपयोग करेंगे Drawable.class, फिर संसाधन आईडी प्राप्त करने के लिए एक और प्रतिबिंब खोज। यह गति अंतर के लिए जिम्मेदार होगा। यह कहा जा रहा है, न तो विशेष रूप से त्वरित हैं और इसलिए वास्तव में कैश करने की आवश्यकता है (विशेषकर यदि एक लूप में उपयोग किया जाता है, या पंक्तियों के लिए ListView)। और प्रतिबिंब के दृष्टिकोण की बड़ी समस्या यह है कि यह एंड्रॉइड के आंतरिक लोगों के बारे में धारणा बनाता है जो भविष्य के कुछ रिलीज में बदल सकते हैं।
कॉमन्सवेयर

1
@CommonsWare: यह सही है। मैं जाँच कर रहा था कि एंड्रॉइड कैसे कार्यान्वित होता है और यह एक देशी कॉल होने के कारण समाप्त होता है। gitorious.org/android-eeepc/base/blobs/… => gitorious.org/android-eeepc/base/blobs/…
Macarse

3
मैं इसके बजाय आईडी के साथ एक पूर्णांक सरणी का उपयोग करेगा। ID के लिए स्ट्रिंग्स का उपयोग करना सही दृष्टिकोण की तरह नहीं है।
EboMike 22

9
क्यों contextपैरामीटर?
रूडी

14
कॉलिंग getId ("आइकन", R.drawable.class) होनी चाहिए; नहीं मिल रहा हैResId ("आइकन", संदर्भ, Drawable.class);
10

80

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

public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

तो अगर आप इस तरह से ड्रा करने योग्य कॉल फ़ंक्शन के लिए प्राप्त करना चाहते हैं

getResourceId("myIcon", "drawable", getPackageName());

और स्ट्रिंग के लिए आप इसे इस तरह कह सकते हैं

getResourceId("myAppName", "string", getPackageName());

इसे पढ़ें


11
एक फ़ंक्शन बनाने का क्या मतलब है जो बस एक दूसरे को कॉल करता है और एक संभावित अपवाद को "हैंडल" करता है? कॉल getResources ()। GetIdentifier () सीधे।
रिकार्डो मेनेघिन फिल्हो

37

यह @Macarse उत्तर पर आधारित है।

संसाधनों को अधिक तेज़ और कोड के अनुकूल तरीके से प्राप्त करने के लिए इसका उपयोग करें।

public static int getId(String resourceName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(resourceName);
        return idField.getInt(idField);
    } catch (Exception e) {
        throw new RuntimeException("No resource ID found for: "
                + resourceName + " / " + c, e);
    }
}

उदाहरण:

getId("icon", R.drawable.class);

30

संसाधन नाम से एक एप्लिकेशन संसाधन आईडी कैसे प्राप्त करें यह काफी सामान्य और अच्छी तरह से उत्तर दिया गया प्रश्न है।

कैसे एक देशी Android संसाधन आईडी प्राप्त करने के लिए संसाधन नाम से कम अच्छी तरह से उत्तर दिया गया है। संसाधन नाम से Android ड्रा करने योग्य संसाधन प्राप्त करने के लिए यहां मेरा समाधान है:

public static Drawable getAndroidDrawable(String pDrawableName){
    int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
    if(resourceId==0){
        return null;
    } else {
        return Resources.getSystem().getDrawable(resourceId);
    }
}

विधि को अन्य प्रकार के संसाधनों तक पहुंचने के लिए संशोधित किया जा सकता है।


अब .getResources () getDrawable मान्य नहीं है। if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
Evilripper

11

यदि आपको एक स्ट्रिंग और एक इंट को जोड़ने की आवश्यकता है, तो मैप के बारे में कैसे?

static Map<String, Integer> icons = new HashMap<String, Integer>();

static {
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.othericon);
    icons.add("someicon", R.drawable.whatever);
}

9

आप उपयोग कर सकते हैं Resources.getIdentifier(), हालांकि आपको अपनी स्ट्रिंग के लिए प्रारूप का उपयोग करने की आवश्यकता है क्योंकि आप इसे अपनी XML फ़ाइलों में उपयोग करते हैं, अर्थात package:drawable/icon


नीचे मेरा जवाब इसके विपरीत है। संसाधन आईडी में पास करें, और फिर getResourceEntryName(id)स्ट्रिंग नाम खोजने के लिए उपयोग करें। लंबे टेक्स्ट से "आइकन" खोजने के लिए कोई गड़बड़ नहीं है।
स्टीव वॉरिंग

8

मुझे यह पसंद आया, यह मेरे लिए काम कर रहा है:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/apple", null, context.getPackageName()));

7
Simple method to get resource ID:

public int getDrawableName(Context ctx,String str){
    return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
}

1
बेहतर होगा कि आप अपने उत्तर के लिए कुछ और जानकारी दें।
xMRi

6

स्ट्रिंग से रिसोर्स आईडी प्राप्त करने का सरल तरीका। यहाँ ResourceName drawable फ़ोल्डर में संसाधन imageView जो एक्सएमएल फ़ाइल में रूप में अच्छी तरह शामिल किया गया है का नाम है।

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
ImageView im = (ImageView) findViewById(resID);
Context context = im.getContext();
int id = context.getResources().getIdentifier(resourceName, "drawable",
context.getPackageName());
im.setImageResource(id);

धन्यवाद आदमी यह वास्तव में उपयोगी था .. मैंने बहुत खोज की और काम नहीं किया। आपका उत्तर देखकर, मैंने पाया कि इसके लिए दूसरा पैरामीटर getIdentifierहोना चाहिए id। एंड्रॉइड देव साइट में इसका उल्लेख भी नहीं किया गया था। आपको वह जानकारी कहां से मिली?
प्रकाश जीपीज

4

चूँकि आपने कहा था कि आप केवल एक पैरामीटर पास करना चाहते थे और यह कोई मायने नहीं रखता था, आप संसाधन पहचानकर्ता को पास कर सकते हैं और फिर इसके लिए स्ट्रिंग नाम का पता लगा सकते हैं, इस प्रकार:

String name = getResources().getResourceEntryName(id);

यह दोनों मान प्राप्त करने का सबसे कुशल तरीका हो सकता है। आपको लंबे स्ट्रिंग से सिर्फ "आइकन" भाग ढूंढने की जरूरत नहीं है।


2

आपके रेस / लेआउट / my_image_layout.xml में

<LinearLayout ...>
    <ImageView
        android:id="@+id/row_0_col_7"
      ...>
    </ImageView>
</LinearLayout>

उस छवि दृश्य को उसके @ आईडी मान द्वारा, अपने जावा कोड के अंदर करने के लिए:

String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
                .getIdentifier(tileID, "id", activity.getPackageName()));

/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);  

2

कोटलिन दृष्टिकोण

inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
            return try {
                val idField = getDeclaredField (resourceName)
                idField.getInt(idField)
            } catch (e:Exception) {
                e.printStackTrace()
                -1
            }
        }

उपयोग:

val resId = R.drawable::class.java.getId("icon")

1

MonoDroid / Xamarin में। और आप कर सकते हैं:

 var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

लेकिन GetIdentifier के बाद से यह Android में अनुशंसित नहीं है - आप इस तरह से प्रतिबिंब का उपयोग कर सकते हैं:

 var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

जहाँ मैं आपके द्वारा पास किए जा रहे तार को आज़माने / पकड़ने या सत्यापित करने का सुझाव देता हूँ।


1

स्ट्रिंग संसाधन नाम से ड्रा करने योग्य आईडी प्राप्त करने के लिए मैं इस कोड का उपयोग कर रहा हूं:

private int getResId(String resName) {
    int defId = -1;
    try {
        Field f = R.drawable.class.getDeclaredField(resName);
        Field def = R.drawable.class.getDeclaredField("transparent_flag");
        defId = def.getInt(null);
        return f.getInt(null);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return defId;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.