Ich möchte auf eine Ressource wie einen String oder einen Drawable mit seinem Namen und nicht mit seiner int-ID zugreifen.
Welche Methode würde ich dafür verwenden?
Es wird so etwas sein wie:
R.drawable.resourcename
Vergewissern Sie sich, dass Sie den Android.R
-Namespace nicht importiert haben, da dies Eclipse verwirren kann (falls dies der Fall ist).
Wenn dies nicht funktioniert, können Sie die getResources
-Methode eines Kontexts immer verwenden ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Wo this.context
als Activity
, Service
oder eine andere Context
-Unterklasse initialisiert wird.
Update:
Wenn es der gewünschte Name ist, hat die Resources
-Klasse (von getResources()
zurückgegeben) eine getResourceName(int)
-Methode und eine getResourceTypeName(int)
?
Update 2 :
Die Resources
-Klasse hat diese Methode:
public int getIdentifier (String name, String defType, String defPackage)
Gibt die Ganzzahl des angegebenen Ressourcennamens zurück, Typ und Paket.
Wenn ich richtig verstanden habe, ist es das, was Sie wollen
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Wo "this" eine Aktivität ist, die nur zur Klarstellung geschrieben wurde.
Wenn Sie einen String in strings.xml oder einen Bezeichner eines Oberflächenelements verwenden möchten, ersetzen Sie "drawable".
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Ich warne Sie, diese Art, Identifikatoren zu erhalten, ist sehr langsam. Verwenden Sie sie nur, wenn dies erforderlich ist.
Link zur offiziellen Dokumentation: Resources.getIdentifier (Stringname, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.Java",this.getPackageName());
Eine einfache Methode zum Abrufen der Ressourcen-ID aus Zeichenfolge. Ressourcenname ist der Name der Ressource ImageView in einem Zeichnungsordner, der ebenfalls in der XML-Datei enthalten ist.
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);
Ich würde vorschlagen, dass Sie meine Methode verwenden, um eine Ressourcen-ID zu erhalten. Es ist viel effizienter als die getIdentidier () -Methode, die langsam ist.
Hier ist der Code:
/**
* @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;
}
Kotlin Version
über Extension Function
So finden Sie eine Ressourcen-ID anhand ihres Namens Fügen Sie in Kotlin das folgende Snippet in einer Kotlin-Datei hinzu:
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
Jetzt können Sie auf alle Ressourcen-IDs zugreifen, wenn Sie eine Kontextreferenz mit der resIdByName
-Methode haben:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
zusätzlich zu @lonkly Lösung
methode:
/**
* 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());
}
}
Ich habe diese Klasse sehr hilfreich gefunden, um mit Ressourcen zu arbeiten. Es gibt einige definierte Methoden, um mit Dimensionen, Farben, Zeichenelementen und Strings wie dieser zu arbeiten:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
// 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());