Jak uzyskać identyfikator zasobu obrazu, jeśli znam jego nazwę (w systemie Android)?
Odpowiedzi:
Z czymś takim:
String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
getResources().getIdentifier(name, "id", getPackageName());
aby uzyskać identyfikator danego ImageButton (tak jak z R.id.name).
name
? Chcę znaleźć identyfikator przycisku, którego odniesienie znam, w moim przypadku jest tobutton1
getResource()
i getPackageName()
pokazuje błąd. cannot resolve method
getResource()
i getPackageName()
są metodami z Activity.
Możesz także spróbować tego:
try {
Class res = R.drawable.class;
Field field = res.getField("drawableName");
int drawableId = field.getInt(null);
}
catch (Exception e) {
Log.e("MyTag", "Failure to get drawable id.", e);
}
Skopiowałem te kody źródłowe z poniższego adresu URL. Na podstawie testów przeprowadzonych na tej stronie jest 5 razy szybszy niż getIdentifier (). Uważam też, że jest bardziej poręczny i łatwy w użyciu. Mam nadzieję, że ci to pomoże.
Przykład publicznego zasobu systemowego:
// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");
Innym sposobem jest odwołanie się do dokumentacji klasy android.R.drawable .
Możesz użyć tej funkcji, aby uzyskać identyfikator zasobu:
public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
try {
return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
} catch (Exception e) {
throw new RuntimeException("Error getting Resource ID.", e)
}
}
Więc jeśli chcesz uzyskać identyfikator zasobu do rysowania , możesz wywołać metodę w następujący sposób:
getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());
(lub z fragmentu):
getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());
Dla String Zasobami ID można nazwać tak:
getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());
itp...
Ostrożnie : zgłasza RuntimeException, jeśli nie znajdzie identyfikatora zasobu. Pamiętaj, aby prawidłowo odzyskać siły podczas produkcji.
static
z tego usunąć , inaczej getResources()
nie zadziała.
Context
nie był dostępny. Naprawiono albo usunięcie static
i przeniesienie go do Context
(np. Activity
Lub Application
); lub alternatywną poprawką jest to, co Jonathan zrobił w swojej edycji, czyli przekazanie a Context
do metody.
Jeszcze jeden scenariusz, z którym się spotkałem.
String imageName = "Hello", a następnie, gdy zostanie przekazany do funkcji getIdentifier jako pierwszy argument, przekaże nazwę z zakończeniem łańcucha o wartości null i zawsze zwróci zero. Przekaż ten imageName.substring (0, imageName.length () - 1)