एक ज्ञात संसाधन नाम के साथ एक संसाधन आईडी कैसे प्राप्त करें?


178

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

इसके लिए मैं किस विधि का उपयोग करूंगा?



विकिपीडिया का कहना है कि कोटलिन पहली बार 2011 में दिखाई दिए थे, आप 2010 के बारे में एक सवाल कैसे पूछ सकते हैं
अभिनव चौहान

जवाबों:


149

यह कुछ इस तरह होगा:

R.drawable.resourcename

सुनिश्चित करें कि आपके पास Android.Rआयातित नाम स्थान नहीं है क्योंकि यह ग्रहण को भ्रमित कर सकता है (यदि यही आप उपयोग कर रहे हैं)।

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

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

जहां this.contextएक Activity, Serviceया किसी अन्य Contextउपवर्ग के रूप में intialised है ।

अपडेट करें:

यदि यह वह नाम है जो आप चाहते हैं, तो Resourcesक्लास (द्वारा लौटाया गया getResources()) में एक getResourceName(int)विधि है, और ए getResourceTypeName(int)?

अपडेट 2 :

Resourcesवर्ग इस विधि है:

public int getIdentifier (String name, String defType, String defPackage) 

जो निर्दिष्ट संसाधन नाम, प्रकार और पैकेज का पूर्णांक देता है।


आपके उत्तर के लिए धन्यवाद .R.drawable.resourcename मैं अभी उपयोग कर रहा हूँ मुझे अपने पूर्णांक मान को resourcename
Aswan

2
R.drawable.resourcename है पूर्णांक।
राबिड

हाय Rabid.what आप ने कहा कि वहाँ किसी भी तरह से पहुँच से R.drawable .resource मूल्य को पार करके है
Aswan

मुझे डायनामिक रूप
असवान

इस मैं चाहता हूँ की तरह Thankq और मैं drawable संसाधन प्राप्त करना चाहते हैं id.how मैं इसे करने के लिए wil
असवान

341

अगर मैं सही समझ गया, तो यही आप चाहते हैं

int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());

जहां "यह" एक गतिविधि है, जिसे केवल स्पष्ट करने के लिए लिखा गया है।

यदि आप स्ट्रिंग्स में एक स्ट्रिंग चाहते हैं। xml या UI तत्व का एक पहचानकर्ता, विकल्प "ड्रॉबल"

int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());

मैं आपको चेतावनी देता हूं, पहचानकर्ताओं को प्राप्त करने का यह तरीका वास्तव में धीमा है, केवल जहां आवश्यक हो, का उपयोग करें।

आधिकारिक दस्तावेज से लिंक करें: Resources.getIdentifier (स्ट्रिंग नाम, स्ट्रिंग defType, स्ट्रिंग defPackage)


3
यह सुनिश्चित करने के लिए परीक्षण परीक्षण के संदर्भ में बहुत उपयोगी है कि कुछ तार मौजूद हैं या आदि
एहतेश चौधरी

1
मैं आदमी को नहीं जानता, मैंने टाइमस्टैम्प के साथ getIdentifier () से पहले और बाद में एक लॉग जोड़ा है और उसने मुझे दिखाया कि यह 0 - 1 एमएस में निष्पादित हो जाता है! तो यह धीमा नहीं है, यह सुपर फास्ट है! मैं इसे संसाधनों से चित्र प्राप्त करने के लिए उपयोग कर रहा हूं और यह पूरी तरह से काम करता है। Nexus5x पर परीक्षण किया गया।
किरिल कर्माज़िन

1
@KirillKarmazin: Nexus5X एक शालीनता से तेज़ फ़ोन है, और इस तरह के कॉल के लिए 1ms काफी धीमा है। याद रखें कि प्रत्येक UI फ़्रेम केवल 16ms का है।
मूविंग डक

विकिपीडिया का कहना है कि कोटलिन पहली बार 2011 में दिखाई दिए थे, आप इसके बारे में 2010 में एक सवाल का जवाब कैसे दे सकते हैं
अभिनव चौहान

25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());

15

• के Kotlin Versionमाध्यम सेExtension Function

कोटलिन में अपने नाम से एक संसाधन आईडी खोजने के लिए, कोटलिन फ़ाइल में स्निपेट के नीचे जोड़ें:

ExtensionFunctions.kt

import android.content.Context
import android.content.res.Resources

fun Context.resIdByName(resIdName: String?, resType: String): Int {
    resIdName?.let {
        return resources.getIdentifier(it, resType, packageName)
    }
    throw Resources.NotFoundException()
}


Usage

अब जहाँ भी आप संदर्भ संदर्भ resIdByNameविधि का उपयोग कर रहे हैं सभी संसाधन आईडी सुलभ हैं :

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    

विकिपीडिया का कहना है कि कोटलिन पहली बार 2011 में दिखाई दिए थे, क्या आप मुझे बता सकते हैं कि यह प्रश्न 2010 में कैसे पूछा गया था, और यह 2019 में एंड्रॉइड के लिए घोषित किया गया था, उन्होंने 2010 में कोटलिन Android प्रश्न कैसे पूछा
अभिनव चौहान

14

स्ट्रिंग से रिसोर्स आईडी प्राप्त करने का सरल तरीका। यहाँ रिसोर्सनामे ड्रा करने योग्य फोल्डर में रिसोर्स इमेज व्यू का नाम है जो XML फ़ाइल में भी शामिल है।

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);

6

मैं आपको एक संसाधन आईडी प्राप्त करने के लिए अपने तरीके का उपयोग करने का सुझाव दूंगा। GetIdentidier () पद्धति का उपयोग करने की तुलना में यह बहुत अधिक कुशल है, जो धीमा है।

यहाँ कोड है:

/**
 * @author Lonkly
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с) {

    Field field = null;
    int resId = 0;
    try {
        field = с.getField(variableName);
        try {
            resId = field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resId;

}

यह सभी मामलों के लिए काम नहीं करेगा। उदाहरण के लिए यदि आपके पास R.string वर्ग की तुलना में <string name = "string.name"> सामग्री </ string> है, तो एक string_name फ़ील्ड होगा। और आपका तरीका इस बिंदु पर काम नहीं करेगा।
ddmytrenko

3
साथ ही आपकी विधि वास्तव में तेज़ नहीं है। क्योंकि जावा वर्ग क्रमबद्धता कभी जल्दी काम नहीं करती है।
ddmytrenko

5
// image from res/drawable
    int resID = getResources().getIdentifier("my_image", 
            "drawable", getPackageName());
// view
    int resID = getResources().getIdentifier("my_resource", 
            "id", getPackageName());

// string
    int resID = getResources().getIdentifier("my_string", 
            "string", getPackageName());

0

मैंने इस वर्ग को संसाधनों से निपटने में बहुत मददगार पाया है । इसमें डिमेंस, कलर, ड्रॉअब और स्ट्रिंग्स से निपटने के लिए कुछ परिभाषित तरीके हैं, जैसे कि यह एक:

public static String getString(Context context, String stringId) {
    int sid = getStringId(context, stringId);
    if (sid > 0) {
        return context.getResources().getString(sid);
    } else {
        return "";
    }
}

विकिपीडिया का कहना है कि कोटलिन पहली बार 2011 में दिखाई दिए थे, क्या आप मुझे बता सकते हैं कि यह प्रश्न 2010 में कैसे पूछा गया था, और यह 2019 में एंड्रॉइड के लिए घोषित किया गया था, उन्होंने 2010 में कोटलिन एंड्रॉइड प्रश्न कैसे पूछा
अभिनव चौहान

0

@lonkly समाधान के अलावा

  1. प्रतिबिंब और फ़ील्ड एक्सेसिबिलिटी देखें
  2. अनावश्यक चर

तरीका:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с)
                     throws android.content.res.Resources.NotFoundException {
    try {
        // lookup field in class 
        java.lang.reflect.Field field = с.getField(variableName);
        // always set access when using reflections  
        // preventing IllegalAccessException   
        field.setAccessible(true);
        // we can use here also Field.get() and do a cast 
        // receiver reference is null as it's static field 
        return field.getInt(null);
    } catch (Exception e) {
        // rethrow as not found ex
        throw new Resources.NotFoundException(e.getMessage());
    }
}

विकिपीडिया का कहना है कि कोटलिन पहली बार 2011 में दिखाई दिए थे, क्या आप मुझे बता सकते हैं कि यह प्रश्न 2010 में कैसे पूछा गया था, और यह 2019 में एंड्रॉइड के लिए घोषित किया गया था, उन्होंने 2010 में कोटलिन एंड्रॉइड प्रश्न कैसे पूछा
अभिनव चौहान

0

कोटलिन में निम्नलिखित मेरे लिए ठीक काम करता है:

val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())

यदि संसाधन mipmap फ़ोल्डर में है, तो आप "drawable" के बजाय पैरामीटर "mipmap" का उपयोग कर सकते हैं।

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