¿Cómo puedo obtener el id de recurso de la imagen si sé su nombre (en Android)?

InformationsquelleAutor manu | 2010-06-15

5 Comentarios

  1. 260

    Con algo como esto:

    String mDrawableName = "myappicon";
    int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
    • Gracias, que me ayudó a encontrar una solución a un simliar problema! Voy a usar getResources().getIdentifier(name, "id", getPackageName()); para obtener el IDENTIFICADOR de un ImageButton (como lo haría con R. id.nombre).
    • Tenga en cuenta que la imagen de nombre NO debe incluir una extensión como «.png»
    • Esta respuesta debería ser marcado como aceptado.
    • lo que les sucede en la variable name ? Quiero encontrar el id de un botón cuya referencia sé, en mi caso es button1
    • getResource() y getPackageName() mostrando error. cannot resolve method
    • Barai, getResource() y getPackageName() son los métodos de la Actividad.
    • mDrawableName debe ser en registro inferior! De lo contrario, reID será 0

  2. 28

    También puede probar este:

    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 de esta fuente de códigos de por debajo de la URL. Basado en las pruebas realizadas en esta página, es 5 veces más rápido que getIdentifier(). También he encontrado que es más práctico y fácil de usar. Espero que ayude a usted.

    Enlace: La Recuperación dinámica de Recursos en Android

    • esto puede ser más rápido, pero encontré que se puede meter en problemas si utiliza proguard. Esto no trabajó en proguard al menos para mí
    • Este getResources().getIdentifier trabaja con proguard
    • gracias por el aviso 🙂
    • La captura de excepciones genéricas es una mala idea. Además, tenga en cuenta que si no existen referencias a la imagen, Proguard puede optimizar la referencia de distancia, ya que no creen que esta siendo utilizada en cualquier lugar.
    • Ahora entiendo 🙂 te refieres a que durante la optimización drawableName cambios y de recursos no se puede encontrar utilizando este método, si estoy en lo cierto? 🙂
    • si tu último comentario es una respuesta a Pablo Lammertsma comentario inmediatamente anterior: No, él quiere decir que el Proguard no lo sabe, esta es una referencia a los recursos, y por lo tanto, puede eliminar el recurso, en la creencia de que no se utiliza.
    • una vez que usted utilice xxxxhdpi, xxhdpi, etc. este método se vuelve menos útil
    • Quieres decir que está obsoleto?
    • Lo siento – ignorar mi comentario… fue mi culpa, este enfoque funciona bien con los distintos tamaños de imagen (xxxhdpi, etc)

  3. 10

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

    Así que si usted desea conseguir un Dibujable ID de Recurso, se puede llamar al método como este:

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

    (o de un fragmento):

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

    Para un Cadena ID de Recurso que se le puede llamar así:

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

    etc…

    Cuidado: Se tira una RuntimeException en caso de no encontrar el ID de Recurso. Asegúrese de recuperar correctamente en la producción.

    Leer esto

    • Creo que usted necesita para eliminar static de que, de lo contrario getResources() no funcionará.
    • Le Mesurier, ¿puede usted explicar por qué? Gracias.
    • En el momento en que me hizo ese comentario, el Context no estaba disponible. Revisión fue a quitar static y lo traslada a un Context (por ejemplo, Activity o Application); o alternativa de la revisión es que Jonathan hizo en su edición, que es pasar de un Context para el método.
    • Gracias por arreglar el código, después de tantos años…
    • Le Mesurier, revisé el historial de edición, justo ahora, es sólo como lo que has dicho, gracias por su amabilidad de responder después de tantos años 🙂
  4. 10

    Ejemplo para un sistema público de recursos:

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

    ¿Cómo puedo obtener el id de recurso de la imagen si puedo saber su nombre?

    Otra forma es consulte la documentación de android.R.dibujable clase.

    • esto es cierto pero debe el derecho de acceso de contexto
    • ¿a qué te refieres?
    • esto significa que yo confundido por los recursos en el código, y lo uso en organizaciones de la clase de actividad
    • Este método es para los recursos del sistema. Que no dependen del contexto.
  5. 0

    Otro escenario que me he encontrado.

    Cadena imageName =»Hola»
    y luego, cuando se pasa a
    getIdentifier función como primer argumento, que pasará del nombre de la cadena la terminación nula y siempre devolverá cero.
    Pasar esta
    imageName.substring(0, imageName.length()-1)

Dejar respuesta

Please enter your comment!
Please enter your name here