it-swarm.com.de

Wie bekomme ich eine Ressourcen-ID mit einem bekannten Ressourcennamen?

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?

144
Aswan

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.

124
Rabid

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)

303
Maragues
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.Java",this.getPackageName());
23
user1393422

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);
11
Muhammad Adil

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;

}
6
Lonkly

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")
.
.
.    
4
aminography

zusätzlich zu @lonkly Lösung 

  1. siehe Reflexionen und Feldzugänglichkeit 
  2. unnötige Variablen

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());
    }
}
0
ceph3us

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 "";
    }
}
0
Diego Malone
// 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
Manthan Patel