Ich möchte auf eine Ressource wie einen String oder ein Drawable anhand ihres Namens und nicht anhand ihrer int-ID zugreifen.
Welche Methode würde ich dafür verwenden?
Ich möchte auf eine Ressource wie einen String oder ein Drawable anhand ihres Namens und nicht anhand ihrer int-ID zugreifen.
Welche Methode würde ich dafür verwenden?
Antworten:
Es wird so etwas sein wie:
R.drawable.resourcename
Stellen Sie sicher, dass Sie den Android.R
Namespace nicht importiert haben, da dies Eclipse verwirren kann (wenn Sie dies verwenden).
Wenn das nicht funktioniert, können Sie immer die getResources
Methode eines Kontexts verwenden ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Wo this.context
wird als ein intialised Activity
, Service
oder jede andere Context
Unterklasse.
Aktualisieren:
Wenn es der gewünschte Name ist, hat die Resources
Klasse (zurückgegeben von getResources()
) eine getResourceName(int)
Methode und ein getResourceTypeName(int)
?
Update 2 :
Die Resources
Klasse hat diese Methode:
public int getIdentifier (String name, String defType, String defPackage)
Dies gibt die Ganzzahl des angegebenen Ressourcennamens, Typs und Pakets zurück.
R.drawable.resourcename
ist die ganze Zahl.
Wenn ich richtig verstanden habe, ist es das, was Sie wollen
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Wo "dies" eine Aktivität ist, die nur zur Verdeutlichung geschrieben wurde.
Wenn Sie einen String in der Datei strings.xml oder einen Bezeichner eines UI-Elements 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 dort, wo sie benötigt werden.
Link zur offiziellen Dokumentation: Resources.getIdentifier (String name, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Kotlin Version
überExtension Function
So finden Sie eine Ressourcen-ID anhand ihres Namens: Fügen Sie in Kotlin das folgende Snippet in eine Kotlin-Datei ein:
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 sind alle Ressourcen-IDs überall dort verfügbar, wo Sie eine Kontextreferenz haben. Verwenden Sie dazu die folgende resIdByName
Methode:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Eine einfache Möglichkeit, die Ressourcen-ID aus einer Zeichenfolge abzurufen. Hier ist resourceName der Name der Ressource ImageView im zeichnbaren Ordner, der auch 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 langsame Methode getIdentidier ().
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;
}
// 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());
Ich fand diese Klasse sehr hilfreich im Umgang mit Ressourcen. Es gibt einige definierte Methoden, um mit Dimensionen, Farben, Zeichen und Zeichenfolgen umzugehen, wie diese:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
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());
}
}
In Kotlin funktioniert folgendes gut für mich:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Wenn sich die Ressource im Ordner mipmap befindet, können Sie den Parameter "mipmap" anstelle von "drawable" verwenden.