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

177

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?

Assuan
quelle
Wikipedia sagt, Kotlin erschien zum ersten Mal im Jahr 2011, wie kann man eine Frage zu 2010 stellen
Abhinav Chauhan

Antworten:

149

Es wird so etwas sein wie:

R.drawable.resourcename

Stellen Sie sicher, dass Sie den Android.RNamespace nicht importiert haben, da dies Eclipse verwirren kann (wenn Sie dies verwenden).

Wenn das nicht funktioniert, können Sie immer die getResourcesMethode eines Kontexts verwenden ...

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

Wo this.contextwird als ein intialised Activity, Serviceoder jede andere ContextUnterklasse.

Aktualisieren:

Wenn es der gewünschte Name ist, hat die ResourcesKlasse (zurückgegeben von getResources()) eine getResourceName(int)Methode und ein getResourceTypeName(int)?

Update 2 :

Die ResourcesKlasse hat diese Methode:

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

Dies gibt die Ganzzahl des angegebenen Ressourcennamens, Typs und Pakets zurück.

Tollwütig
quelle
Vielen Dank für Ihre Antwort .R.drawable.resourcename Ich verwende jetzt Ich muss seinen ganzzahligen Wert durch Übergabe von Ressourcenname
Assuan
2
R.drawable.resourcename ist die ganze Zahl.
Tollwütiger
Hallo Rabid. Was du gesagt hast, das gibt es in irgendeiner Weise, indem du auf R.drawable .resource value zugreifst, indem du resouce übergibst
Assuan
Ich brauche diesen ganzzahligen Wert, indem ich den Ressourcennamen dynamisch übergebe
Assuan
Vielen Dank, ich möchte und ich möchte eine zeichnbare Ressource erhalten. Wie ich dazu komme
Assuan
338

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)

Maragues
quelle
3
Dies ist ziemlich nützlich im Zusammenhang mit dem Schreiben von Tests, um sicherzustellen, dass bestimmte Zeichenfolgen vorhanden sind usw.
Ehtesh Choudhury
1
Ich kenne keinen Mann, ich habe vor und nach getIdentifier () ein Protokoll mit Zeitstempel hinzugefügt und es hat mir gezeigt, dass es in 0 - 1 ms ausgeführt wird! Es ist also nicht langsam, es ist super schnell! Ich verwende es, um Bilder von Ressourcen zu erhalten, und es funktioniert perfekt. Getestet auf Nexus5x.
Kirill Karmazin
1
@KirillKarmazin: Nexus5X ist ein anständig schnelles Telefon, und 1 ms für einen solchen Anruf ist ziemlich langsam. Denken Sie daran, dass jeder UI-Frame nur 16 ms beträgt.
Mooing Duck
Wikipedia sagt, Kotlin erschien zum ersten Mal im Jahr 2011, wie können Sie eine Frage dazu im Jahr 2010 beantworten
Abhinav Chauhan
25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
user1393422
quelle
15

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 resIdByNameMethode:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    
Aminographie
quelle
Wikipedia sagt, Kotlin erschien zum ersten Mal im Jahr 2011, können Sie mir bitte sagen, wie diese Frage im Jahr 2010 gestellt wurde, und es wurde für Android im Jahr 2019 deklariert, wie wird ihm Kotlin Android-Frage im Jahr 2010 gestellt
Abhinav Chauhan
14

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

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;

}
Langsam
quelle
Es wird nicht in allen Fällen funktionieren. Wenn Sie beispielsweise <string name = "string.name"> content </ string> haben, verfügt die R.string-Klasse über ein string_name-Feld. Und Ihre Methode wird in diesem Punkt nicht funktionieren.
ddmytrenko
3
Auch Ihre Methode ist eigentlich nicht schnell. Weil die Serialisierung von Java-Klassen niemals schnell funktioniert.
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());
Manthan Patel
quelle
0

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 "";
    }
}
Diego Malone
quelle
Wikipedia sagt, Kotlin erschien zum ersten Mal im Jahr 2011, können Sie mir bitte sagen, wie diese Frage im Jahr 2010 gestellt wurde, und es wurde für Android im Jahr 2019 deklariert, wie wird ihm Kotlin Android-Frage im Jahr 2010 gestellt
Abhinav Chauhan
0

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());
    }
}
ceph3us
quelle
Wikipedia sagt, Kotlin erschien zum ersten Mal im Jahr 2011, können Sie mir bitte sagen, wie diese Frage im Jahr 2010 gestellt wurde, und es wurde für Android im Jahr 2019 deklariert, wie wird ihm Kotlin Android-Frage im Jahr 2010 gestellt
Abhinav Chauhan
0

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.

Jens van de Mötter
quelle