wake-up-neo.net

Android, Ressourcen-ID von Zeichenfolge abrufen?

Ich muss eine Ressourcen-ID an eine Methode in einer meiner Klassen übergeben. Es muss sowohl die ID verwendet werden, auf die die Referenz verweist, als auch die Zeichenfolge. Wie soll ich das am besten erreichen?

Zum Beispiel:

R.drawable.icon

Ich muss die ganzzahlige ID von diesem bekommen, aber ich brauche auch Zugriff auf den String "icon".

Es wäre vorzuziehen, wenn ich nur die Zeichenfolge "icon" an die Methode übergeben müsste.

130
Hamid

@EboMike: Ich wusste nicht, dass Resources.getIdentifier() existiert.

In meinen Projekten habe ich dazu folgenden Code verwendet:

public static int getResId(String resName, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Es würde so verwendet, um den Wert von R.drawable.icon resource integer value zu erhalten 

int resID = getResId("icon", R.drawable.class); // or other resource class

Ich habe gerade einen Blogbeitrag gefunden, der besagt, dass Resources.getIdentifier() langsamer ist als Reflexion wie ich. Hör zu .

141
Macarse

Mit dieser Funktion können Sie die Ressourcen-ID abrufen.

public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Wenn Sie also drawable aufrufen möchten, rufen Sie diese Funktion auf

getResourceId("myIcon", "drawable", getPackageName());

und für string kannst du es so nennen

getResourceId("myAppName", "string", getPackageName());

Lesen Sie dies

66
Azhar

Dies basiert auf einer @ Macarse-Antwort.

Verwenden Sie diese Option, um die Ressourcen-ID schneller und codefreundlicher abzurufen.

public static int getId(String resourceName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(resourceName);
        return idField.getInt(idField);
    } catch (Exception e) {
        throw new RuntimeException("No resource ID found for: "
                + resourceName + " / " + c, e);
    }
}

Beispiel:

getId("icon", R.drawable.class);
36
Daniel De León

Wie man eine application resource ID aus dem Ressourcennamen erhält, ist eine häufig gestellte und gut beantwortete Frage.

Wie man eine native Android Ressourcen-ID aus dem Ressourcennamen erhält, wird weniger gut beantwortet. Hier ist meine Lösung, eine Android-Ressource nach Ressourcenname zu zeichnen:

public static Drawable getAndroidDrawable(String pDrawableName){
    int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "Android");
    if(resourceId==0){
        return null;
    } else {
        return Resources.getSystem().getDrawable(resourceId);
    }
}

Die Methode kann geändert werden, um auf andere Ressourcentypen zuzugreifen.

29
Martin Pearman

Wenn Sie einen String und ein Int miteinander koppeln müssen, wie wäre es dann mit einer Map?

static Map<String, Integer> icons = new HashMap<String, Integer>();

static {
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.othericon);
    icons.add("someicon", R.drawable.whatever);
}
11
Peter Knego

Sie können Resources.getIdentifier() verwenden, obwohl Sie das Format für Ihre Zeichenfolge verwenden müssen, wenn Sie es in Ihren XML-Dateien verwenden, d. H. package:drawable/icon.

9
EboMike

Das hat mir gefallen, es funktioniert für mich:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/Apple", null, context.getPackageName()));
5

Eine einfache Methode zum Abrufen der Ressourcen-ID aus Zeichenfolge . Hier resourceName ist der Name der Ressource ImageView im zu zeichnenden Ordner, 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);
4
Muhammad Adil

Da Sie sagten, Sie wollten nur einen Parameter übergeben, und es schien nicht wichtig zu sein, welchen. Sie könnten die Ressourcen-ID übergeben und dann den Namen der Zeichenkette herausfinden, also:

String name = getResources().getResourceEntryName(id);

Dies ist möglicherweise der effizienteste Weg, um beide Werte zu erhalten. Sie müssen sich nicht damit beschäftigen, nur den "icon" -Teil einer längeren Zeichenfolge zu finden.

3
Steve Waring
public int getDrawableName(Context ctx,String str){
    return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());

}
2
Ivan Vovk

Der Kotlin-Ansatz

inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
            return try {
                val idField = getDeclaredField (resourceName)
                idField.getInt(idField)
            } catch (e:Exception) {
                e.printStackTrace()
                -1
            }
        }

Verwendungszweck:

val resId = R.drawable::class.Java.getId("icon")
1
Arsenius

In MonoDroid/Xamarin.Android können Sie Folgendes tun:

 var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

Da GetIdentifier jedoch in Android nicht empfohlen wird, können Sie Reflection folgendermaßen verwenden:

 var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

wo ich vorschlage, einen Versuch/Fang zu setzen oder die Strings zu überprüfen, die Sie übergeben.

1
Daniele D.

In Ihrer res/layout/my_image_layout.xml

<LinearLayout ...>
    <ImageView
        Android:id="@+id/row_0_col_7"
      ...>
    </ImageView>
</LinearLayout>

Um diese ImageView anhand ihres @ + id-Werts zu erfassen, führen Sie in Ihrem Java-Code Folgendes aus: 

String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
                .getIdentifier(tileID, "id", activity.getPackageName()));

/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);  
0
Gene

Um eine Drawable-ID vom String-Ressourcennamen zu erhalten, verwende ich diesen Code:

private int getResId(String resName) {
    int defId = -1;
    try {
        Field f = R.drawable.class.getDeclaredField(resName);
        Field def = R.drawable.class.getDeclaredField("transparent_flag");
        defId = def.getInt(null);
        return f.getInt(null);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return defId;
    }
}
0
bitvale