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?
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?
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.
Dziękuję za odpowiedź .R.drawable.resourcename Używam teraz Potrzebuję uzyskać jego wartość całkowitą, przekazując resourcename – Aswan
'R.drawable.resourcename' * jest * liczbą całkowitą. – Rabid
Witam Rabid.what powiedziałeś, że jest tam jakikolwiek sposób, uzyskując R.drawable .resource wartość przekazując resouce – Aswan
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)
Jest to bardzo przydatne w kontekście pisania testów, aby upewnić się, że istnieją pewne ciągi znaków itp. –
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. –
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;
}
Nie będzie działać we wszystkich przypadkach. Na przykład, jeśli masz
Również twoja metoda nie jest szybka. Ponieważ serializacja klasy Java nigdy nie działa szybko. – ddmytrenko
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Byłoby jeszcze lepiej, gdybyś wyjaśnił kod, który wysłałeś. –
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);
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 "";
}
}
oprócz @lonkly rozwiązanie
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());
}
}
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