2010-08-13 17 views
130

Chcę uzyskać dostęp do zasobu takiego jak ciąg lub ciągniony według jego nazwy, a nie jego int id.Jak uzyskać identyfikator zasobu o znanej nazwie zasobu?

Którą metodę użyłbym do tego?

+1

możliwy duplikat [Jak mogę uzyskać identyfikator zasobu obrazu, jeśli znam jego nazwę?] (Http://stackoverflow.com/questions/3042961/how-can-i-get-the-resource-id- of-an-image-if-i-know-its-name) – ghoti

Odpowiedz

116

To będzie coś takiego:

R.drawable.resourcename

Upewnij się, że nie mają nazw Android.R importowane, gdyż może to mylić Eclipse (jeśli to jest to, czego używasz).

Jeśli to nie pomoże, zawsze można użyć getResources metodę kontekście za ...

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

Gdzie this.context jest intialised jako Activity, Service lub innego Context podklasy.

Aktualizacja:

Jeśli jest to nazwa chcesz, klasa Resources (zwrócony przez getResources()) ma metodę getResourceName(int) i getResourceTypeName(int)?

Aktualizacja 2:

Klasa Resources ma tę metodę:

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

która zwraca liczbę całkowitą podanej nazwy zasobu, typu & pakiet.

+0

Dziękuję za odpowiedź .R.drawable.resourcename Używam teraz Potrzebuję uzyskać jego wartość całkowitą, przekazując resourcename – Aswan

+1

'R.drawable.resourcename' * jest * liczbą całkowitą. – Rabid

+0

Witam Rabid.what powiedziałeś, że jest tam jakikolwiek sposób, uzyskując R.drawable .resource wartość przekazując resouce – Aswan

268

Gdybym rozumiane prawo, to jest to, co chcesz

int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName()); 

gdzie „to” jest aktywny, napisany tylko w celu wyjaśnienia.

W przypadku, gdy chcesz ciąg w strings.xml lub identyfikator elementu UI, zastępczego „rozciągliwej”

int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName()); 

cię ostrzec, to sposób otrzymywania identyfikatorów jest bardzo powolny, należy używać tylko w razie potrzeby .

Link do oficjalnej dokumentacji: Resources.getIdentifier(String name, String defType, String defPackage)

+2

Jest to bardzo przydatne w kontekście pisania testów, aby upewnić się, że istnieją pewne ciągi znaków itp. –

+0

Nie znam człowieka, ja Dodałem dziennik przed i po getIdentifier() ze znacznikiem czasu i pokazało mi, że jest on wykonywany w czasie 0-1 ms! Więc nie jest powolny, jest super szybki! Używam go do pobierania obrazów z zasobów i działa idealnie. Testowane na Nexus5x. –

6

Sugerowałbym stosując moją metodę, aby uzyskać identyfikator zasobów. Jest o wiele bardziej wydajne niż użycie metody getIdentidier(), która jest wolna.

Oto kod:

/** 
* @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; 

} 
+0

Nie będzie działać we wszystkich przypadkach. Na przykład, jeśli masz content niż klasa R.string będzie miała nazwę string_name. A twoja metoda nie zadziała w tym momencie. – ddmytrenko

+2

Również twoja metoda nie jest szybka. Ponieważ serializacja klasy Java nigdy nie działa szybko. – ddmytrenko

22
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName()); 
+4

Byłoby jeszcze lepiej, gdybyś wyjaśnił kod, który wysłałeś. –

9

Prostym sposobem na uzyskanie identyfikatora zasobu z łańcucha. Tutaj nazwa_źródła to nazwa zasobu ImageView w folderze do rysowania, który jest również zawarty w pliku XML.

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); 
0

Znalazłem this class bardzo pomocny w obsłudze zasobów.Ma pewne zdefiniowane metody radzenia sobie z dimens, kolorów kanału alfa i łańcuchów, jak ten:

public static String getString(Context context, String stringId) { 
    int sid = getStringId(context, stringId); 
    if (sid > 0) { 
     return context.getResources().getString(sid); 
    } else { 
     return ""; 
    } 
} 
0

oprócz @lonkly rozwiązanie

  1. zobaczyć odbicia i dostępności pole
  2. niepotrzebnych zmiennych

metoda:

/** 
* 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()); 
    } 
} 
Powiązane problemy