Necesito para pasar la ID de un recurso a un método en una de mis clases. Que necesita para utilizar tanto en la identificación de que los puntos de referencia a y también de las necesidades de la cadena. ¿Cómo debo la mejor forma de lograr esto?

Por ejemplo:

R.drawable.icon

Necesito para obtener el IDENTIFICADOR entero de esto, pero yo también necesitan tener acceso a la cadena de «icono».

Sería preferible si todo lo que tenía que pasar para que el método es el «icono» de la cadena.

  • es posible que en forma similar a getId de los archivos guardados en el almacenamiento interno? Tengo problema porque tengo el caso de que la oferta de la matriz de id en lugar de ubicaciones a mi galería (pensamiento es adaptador).. gracias
  • Ellos no tienen Identificadores en el almacenamiento interno. Son sólo imágenes, si cualquier cosa que usted necesita para cargar un montón de objetos de la Imagen y pasar esos, es posible que desee comenzar una nueva pregunta, sin embargo.
  • posibles duplicados de Cómo obtener un identificador de recursos con un recurso conocido nombre?
InformationsquelleAutor Hamid | 2010-12-13

14 Comentarios

  1. 150

    @EboMike: yo no sabía que Resources.getIdentifier() existido.

    En mis proyectos he utilizado 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;
        } 
    }

    Sería utilizado como esta para obtener el valor de R.drawable.icon de los recursos valor entero

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

    Acabo de encontrar un post en el blog diciendo que Resources.getIdentifier() es más lento que el uso de la reflexión como yo lo hice. Check it out.

    • En la actualidad, getIdentifier() tiene que hacer dos reflexión de las búsquedas. En el ejemplo anterior, getIdentifier() haría uso de la reflexión para obtener Drawable.class, luego otro reflejo de búsqueda para obtener el IDENTIFICADOR de recurso. Eso explicaría la diferencia de velocidad. Que siendo dicho, ni son especialmente rápido y por lo tanto necesitan ser almacenados en caché (especialmente si se utiliza en un loop o filas en una ListView). Y el método de reflexión del gran problema es que hace suposiciones acerca de las interioridades de Android que podría cambiar en un futuro de liberación.
    • Eso es correcto. Yo estaba revisando cómo android implementado y termina ups ser una llamada nativa. gitorious.org/android-eeepc/base/blobs/… => gitorious.org/android-eeepc/base/blobs/…
    • Lo siento chicos, todavía no veo una respuesta aceptable. Quiero minimizar los parámetros no aumentarlos. ¿y si me pasan el Identificador de recursos (R. dibujable.icono) como un entero, entonces puedo usar el id para obtener el nombre del recurso y tira de la parte que necesito para conseguir «icono»?
    • Si usted puede pasar R.drawable.icon a su método sólo puede hacerlo como usted dijo: methodName(int R.drawable.icon, "icon");. No sé por qué quieres hacer eso, pensó.
    • Sólo quiero pasar el uno, myMethod(int R. dibujable.icono) y el método de uso de la int como el recurso a la carga, y encontrar «icono», como la cadena de identificar.
    • Bien, tal vez nos diga exactamente lo que usted desea? Quería convertir una cadena a un ID, tienes dos soluciones para eso. Cuéntanos lo que estás tratando de hacer, lo que los datos que tiene y lo que no tenemos, y podemos ajustar las respuestas. Si usted tiene el ID como un int, entonces ¿por qué necesita para convertir un string a int?
    • Estoy de carga de imágenes, necesito una cadena para identificar cada imagen, y necesito el id (int) que me permitirá obtener la imagen a partir de los recursos. Me gustaría que la cadena de identificación a ser el nombre del archivo (sin la extensión) que se encuentra al final de la R. dibujable.nombre de archivo (int) que me puedan pasar para el método.
    • Me gustaría utilizar una matriz de enteros con los Identificadores de lugar. El uso de cadenas para las IDs no suena como el enfoque correcto.
    • Yo acepte esta respuesta porque de las soluciones propuestas en los comentarios por EboMike. Entero Id fue sin duda el camino a seguir.
    • ¿Por qué el context parámetro?
    • Siempre devuelven -1 para mí.
    • Me siga las instrucciones en el enlace del blog y es un trabajo
    • Llamamiento debe ser getId(«icono», R.drawable.class); no getResId(«icono», el contexto, Drawable.class);
    • ¿Cómo puedo usar esto buscar una cadena de caracteres? Que clase debería pasar como segundo parámetro

  2. 70

    Puede utilizar esta función para obtener el ID de recursos.

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

    Así que si usted desea conseguir para dibujable función de llamada como esta

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

    y para la cadena que se le puede llamar como este

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

    Leer esto

    • para que funcione he tenido que quitar ‘estática’
    • ¿Cuál es el punto de hacer una función que simplemente llama a otro y «asas» con la posible excepción? Llame getResources().getIdentifier() directamente.
  3. 36

    Esto se basa en @Macarse respuesta.

    Utilizar esto para obtener la Identificación de los recursos de una manera más rápida y código de forma amigable.

    public static int getId(String resourceName, Class<?> c) {
        try {
            Field idField = c.getDeclaredField(resourceName);
            return idField.getInt(idField);
        } catch (Exception e) {
            throw new RuntimeException("No resource ID found for: "
                    + resourceName + " /" + c, e);
        }
    }

    Ejemplo:

    getId("icon", R.drawable.class);
    • Este es el código que funcionaba. no el de arriba buggy uno!
  4. 29

    Cómo obtener una aplicación id de recurso de que el nombre del recurso es bastante común y así respondió a la pregunta.

    Cómo obtener una nativa de Android id de recurso de que el nombre del recurso es menos bien contestadas.
    Aquí está mi solución para conseguir un Android dibujable recurso nombre del recurso:

    public static Drawable getAndroidDrawable(String pDrawableName){
        int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "android");
        if(resourceId==0){
            return null;
        } else {
            return Resources.getSystem().getDrawable(resourceId);
        }
    }

    El método puede ser modificado para tener acceso a otros tipos de recursos.

    • ahora .getResources().getDrawable está en desuso if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
  5. 10

    Si usted necesita par una cadena y un entero, entonces cómo sobre un Mapa?

    static Map<String, Integer> icons = new HashMap<String, Integer>();
    
    static {
        icons.add("icon1", R.drawable.icon);
        icons.add("icon2", R.drawable.othericon);
        icons.add("someicon", R.drawable.whatever);
    }
  6. 9

    Puede utilizar Resources.getIdentifier(), aunque es necesario utilizar el formato de cadena de caracteres a medida que se utiliza en los archivos XML, es decir,package:drawable/icon.

    • Mi respuesta a continuación es el inverso de este. Pasar el id de recurso y, a continuación, utilizar getResourceEntryName(id) para encontrar el nombre de la cadena. No meterse a encontrar «icono» del texto más largo.
  7. 5

    Yo lo hice así, se está trabajando para mí:

        imageView.setImageResource(context.getResources().
             getIdentifier("drawable/apple", null, context.getPackageName()));
  8. 4

    Una forma sencilla de obtener el ID de recursos de cadena.
    Aquí resourceName es el nombre de recurso ImageView en dibujable carpeta que se incluye en el archivo XML bien.

    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);
    • Gracias hombre se fue de mucha ayuda.. he buscado mucho y no la ha conseguido trabajado. Al ver tu respuesta, me encontré con que el segundo parámetro para getIdentifier tiene que ser id. Este no fue siquiera mencionada en android dev sitio. ¿de dónde obtuvo esa información ?
  9. 3

    Ya que usted dijo que sólo quería pasar un parámetro y no se parece a la materia, se podría pasar el identificador de recursos en y, a continuación, averiguar el nombre de la cadena para ello, así:

    String name = getResources().getResourceEntryName(id);

    Esta podría ser la forma más eficiente de obtención de ambos valores. Usted no tiene que meterse en torno a encontrar el «icono» parte de una cadena más larga.

  10. 3
    public int getDrawableName(Context ctx,String str){
        return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());
    
    }
    • Sería mejor si usted acaba de dar alguna información más a su respuesta.
  11. 1

    De MonoDroid /Xamarin.Android que usted puede hacer:

     var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

    Pero desde GetIdentifier no se recomienda en Android – usted puede utilizar la Reflexión como esta:

     var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

    donde me sugieren poner un try/catch o verificar las cuerdas está pasando.

  12. 1

    En su res/layout/my_image_layout.xml

    <LinearLayout ...>
        <ImageView
            android:id="@+id/row_0_col_7"
          ...>
        </ImageView>
    </LinearLayout>

    A agarrar ese ImageView por su @+id de valor, dentro de su código java ello:

    String row = "0";
    String column= "7";
    String tileID = "row_" + (row) + "_col_" + (column);
    ImageView image = (ImageView) activity.findViewById(activity.getResources()
                    .getIdentifier(tileID, "id", activity.getPackageName()));
    
    /*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
    image.setImageResource(R.mipmap.blank);  
  13. 1

    La Kotlin enfoque

    inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
                return try {
                    val idField = getDeclaredField (resourceName)
                    idField.getInt(idField)
                } catch (e:Exception) {
                    e.printStackTrace()
                    -1
                }
            }

    Uso:

    val resId = R.drawable::class.java.getId("icon")
  14. 0

    Para llegar Dibujable id de recurso de Cadena nombre, yo estoy usando este código:

    private int getResId(String resName) {
        int defId = -1;
        try {
            Field f = R.drawable.class.getDeclaredField(resName);
            Field def = R.drawable.class.getDeclaredField("transparent_flag");
            defId = def.getInt(null);
            return f.getInt(null);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            return defId;
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here