मैं अपने नाम से एक स्ट्रिंग या एक ड्रॉबल जैसे संसाधन का उपयोग करना चाहता हूं न कि इसकी इंट आईडी।
इसके लिए मैं किस विधि का उपयोग करूंगा?
मैं अपने नाम से एक स्ट्रिंग या एक ड्रॉबल जैसे संसाधन का उपयोग करना चाहता हूं न कि इसकी इंट आईडी।
इसके लिए मैं किस विधि का उपयोग करूंगा?
जवाबों:
यह कुछ इस तरह होगा:
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
है पूर्णांक।
अगर मैं सही समझ गया, तो यही आप चाहते हैं
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
जहां "यह" एक गतिविधि है, जिसे केवल स्पष्ट करने के लिए लिखा गया है।
यदि आप स्ट्रिंग्स में एक स्ट्रिंग चाहते हैं। xml या UI तत्व का एक पहचानकर्ता, विकल्प "ड्रॉबल"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
मैं आपको चेतावनी देता हूं, पहचानकर्ताओं को प्राप्त करने का यह तरीका वास्तव में धीमा है, केवल जहां आवश्यक हो, का उपयोग करें।
आधिकारिक दस्तावेज से लिंक करें: Resources.getIdentifier (स्ट्रिंग नाम, स्ट्रिंग defType, स्ट्रिंग defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
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")
.
.
.
स्ट्रिंग से रिसोर्स आईडी प्राप्त करने का सरल तरीका। यहाँ रिसोर्सनामे ड्रा करने योग्य फोल्डर में रिसोर्स इमेज व्यू का नाम है जो 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);
मैं आपको एक संसाधन आईडी प्राप्त करने के लिए अपने तरीके का उपयोग करने का सुझाव दूंगा। 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;
}
// 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());
मैंने इस वर्ग को संसाधनों से निपटने में बहुत मददगार पाया है । इसमें डिमेंस, कलर, ड्रॉअब और स्ट्रिंग्स से निपटने के लिए कुछ परिभाषित तरीके हैं, जैसे कि यह एक:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
@lonkly समाधान के अलावा
तरीका:
/**
* 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());
}
}
कोटलिन में निम्नलिखित मेरे लिए ठीक काम करता है:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
यदि संसाधन mipmap फ़ोल्डर में है, तो आप "drawable" के बजाय पैरामीटर "mipmap" का उपयोग कर सकते हैं।