¿Cómo obtengo la identificación del recurso de una imagen si sé su nombre?


Respuestas:


269

Con algo como esto:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
¡Gracias, eso me ayudó a encontrar una solución a un problema similar! Lo getResources().getIdentifier(name, "id", getPackageName());usaré para obtener la ID de un ImageButton (como lo haría con R.id.name).
Select0r

42
Tenga en cuenta que el nombre dibujable NO debe incluir una extensión como ".png"
larham1

1
¿Qué va exactamente en la variable name? Quiero encontrar la identificación de un botón cuya referencia conozco, en mi caso esbutton1
John Watson

1
getResource()y getPackageName()mostrando error. cannot resolve method
Srujan Barai

@Srujan Barai, getResource()y getPackageName()son métodos de Activity.
The Berga

29

También puedes probar esto:

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

He copiado estos códigos fuente de la siguiente URL. Según las pruebas realizadas en esta página, es 5 veces más rápido que getIdentifier (). También me pareció más útil y fácil de usar. Espero que te ayude también.

Enlace: Recuperación dinámica de recursos en Android


2
Esto podría ser más rápido, pero descubrí que puede meterte en problemas si usas Proguard. Esto no funcionó en proguard al menos para mí
Pedro Rainho

Capturar excepciones genéricas es una idea especialmente mala. Además, tenga en cuenta que si no hay referencias duras al dibujo, Proguard puede optimizar la referencia, ya que no cree que se esté utilizando en ninguna parte.
Paul Lammertsma

Ahora entiendo :) quiere decir que durante la optimización, drawableName cambia y no se pueden encontrar recursos utilizando este método, si estoy en lo cierto. :)
VSB

1
@VSB: si su último comentario es una respuesta al comentario de Paul Lammertsma inmediatamente anterior: No, quiere decir que Proguard no sabe que esto es una referencia al recurso, por lo que podría eliminar el recurso, creyendo que no se utiliza.
ToolmakerSteve

una vez que use xxxxhdpi, xxhdpi, etc., este método se vuelve menos útil
alguien en algún lugar el

11

Ejemplo para un recurso del sistema público:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

alerta

Otra forma es referir la documentación para la clase android.R.drawable .


1
@Milaaaad, ¿qué quieres decir?
naXa

significa que estoy confundido por los recursos en el código y lo uso en la clase sin actividad
Milaaaad

1
@Milaaaad Este método es para recursos del sistema. No dependen del contexto.
naXa

10

Puede usar esta función para obtener un ID de recurso:

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


Entonces, si desea obtener una ID de recurso extraíble , puede llamar al método de esta manera:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(o de un fragmento):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


Para un ID de recurso de cadena puede llamarlo así:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

etc ...


Cuidado : arroja una RuntimeException si no puede encontrar la ID del recurso. Asegúrese de recuperarse adecuadamente en la producción.

Lee esto


44
Creo que necesita eliminar staticde eso, de lo contrario getResources()no funcionará.
Richard Le Mesurier

@ Richard Le Mesurier, ¿puedes explicar por qué? Gracias.
Veer el

1
@ Leo.Han En el momento en que hice ese comentario, el Contextno estaba disponible. La solución era eliminarlo staticy moverlo a un Context(por ejemplo, Activityo Application); o una solución alternativa es lo que Jonathan hizo en su edición, que es pasar Contextal método.
Richard Le Mesurier

1
@Richard Le Mesurier, revisé el historial de edición en este momento, es justo lo que dijiste, gracias por tu amable respuesta después de tantos años :)
Veer el

0

Otro escenario que encontré.

String imageName = "Hello" y luego, cuando se pasa a la función getIdentifier como primer argumento, pasará el nombre con la terminación de cadena nula y siempre devolverá cero. Pase esta imageName.substring (0, imageName.length () - 1)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.