Android, ¿obtienes el ID de recurso de la cadena?

Resuelto Hamid asked hace 54 años • 15 respuestas

Necesito pasar un ID de recurso a un método en una de mis clases. Necesita usar tanto la identificación a la que apunta la referencia como también la cadena. ¿Cuál es la mejor manera de lograr esto?

Por ejemplo:

R.drawable.icon

Necesito obtener el ID entero de esto, pero también necesito acceso a la cadena "icono".

Sería preferible si todo lo que tuviera que pasar al método fuera la cadena del "icono".

Hamid avatar Jan 01 '70 08:01 Hamid
Aceptado

@EboMike: No sabía que eso Resources.getIdentifier()existía.

En mis proyectos utilicé el siguiente código para hacer eso:

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;
    } 
}

Se usaría así para obtener el valor del R.drawable.iconvalor entero del recurso.

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

Acabo de encontrar una publicación de blog que dice que Resources.getIdentifier()es más lento que usar la reflexión como lo hice yo. Échale un vistazo .

ADVERTENCIA : esta solución fallará en la versión de lanzamiento si la reducción de código/recursos está habilitada como lo sugiere Google: https://developer.android.com/build/shrink-code
Además, puede fallar en otros casos, por ejemplo, cuando tendrá <string name="string.name">…</string>el nombre del campo real string_namey no elstring.name

Macarse avatar Dec 13 '2010 11:12 Macarse

Puede utilizar esta función para obtener el ID del recurso.

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

Entonces, si desea obtener una función de llamada dibujable como esta

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

y para cadena puedes llamarlo así

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

Lee esto

Azhar avatar Sep 30 '2013 11:09 Azhar