Come ottenere un ID risorsa con un nome risorsa noto?


Risposte:


149

Sarà qualcosa del tipo:

R.drawable.resourcename

Assicurati di non avere lo Android.Rspazio dei nomi importato in quanto può confondere Eclipse (se è quello che stai usando).

Se non funziona, puoi sempre utilizzare il getResourcesmetodo di un contesto ...

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

Dove this.contextè intialised come Activity, Serviceo di qualsiasi altra Contextsottoclasse.

Aggiornare:

Se è il nome desiderato, la Resourcesclasse (restituita da getResources()) ha un getResourceName(int)metodo e un getResourceTypeName(int)?

Aggiornamento 2 :

La Resourcesclasse ha questo metodo:

public int getIdentifier (String name, String defType, String defPackage) 

Che restituisce il numero intero del nome, del tipo e del pacchetto di risorse specificati.


Grazie per la tua risposta .R.drawable.resourcename che sto usando ora ho bisogno di ottenere il suo valore intero passando resourcename
Aswan

2
R.drawable.resourcename è il numero intero.
Rabid,

Ciao Rabid. Quello che hai detto che è lì accedendo a R.drawable .resource value passando resouce
Aswan

ho bisogno di quel valore intero passando dinamicamente il nome della risorsa
Assuan

Grazie in questo modo voglio e voglio ottenere un ID di risorsa disegnabile. Come lo farò
Assuan

341

Se ho capito bene, questo è quello che vuoi

int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());

Dove "questo" è un'attività, scritta solo per chiarire.

Nel caso in cui si desideri una stringa in strings.xml o un identificatore di un elemento dell'interfaccia utente, sostituire "drawable"

int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());

Ti avverto, questo modo di ottenere identificatori è molto lento, usa solo dove necessario.

Link alla documentazione ufficiale: Resources.getIdentifier (String name, String defType, String defPackage)


3
Questo è piuttosto utile nel contesto della scrittura di test per assicurarsi che esistano determinate stringhe o ecc.
Ehtesh Choudhury,

1
Non lo so amico, ho aggiunto un registro prima e dopo getIdentifier () con timestamp e mi ha mostrato che viene eseguito in 0 - 1 ms! Quindi non è lento, è super veloce! Lo sto usando per ottenere immagini da risorse e funziona perfettamente. Testato su Nexus5x.
Kirill Karmazin,

1
@KirillKarmazin: Nexus5X è un telefono abbastanza veloce e 1ms per una chiamata del genere è piuttosto lento. Ricorda che ogni frame dell'interfaccia utente ha solo 16ms.
Mooing Duck il

wikipedia dice che Kotlin è apparso per la prima volta nel 2011, come puoi rispondere a una domanda al riguardo nel 2010
Abhinav Chauhan

25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());

15

Kotlin VersionviaExtension Function

Per trovare un ID risorsa con il suo nome In Kotlin, aggiungi lo snippet di seguito in un file kotlin:

ExtensionFunctions.kt

import android.content.Context
import android.content.res.Resources

fun Context.resIdByName(resIdName: String?, resType: String): Int {
    resIdName?.let {
        return resources.getIdentifier(it, resType, packageName)
    }
    throw Resources.NotFoundException()
}


Usage

Ora tutti gli ID risorsa sono accessibili ovunque si abbia un riferimento al contesto usando il resIdByNamemetodo:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    

wikipedia dice che kotlin è apparso per la prima volta nel 2011, puoi dirmi come è stata posta questa domanda nel 2010, ed è stata dichiarata per Android nel 2019, come è stata posta la domanda di kotlin per Android nel 2010
Abhinav Chauhan

14

Un modo semplice per ottenere l'ID risorsa dalla stringa. Qui resourceName è il nome della risorsa ImageView nella cartella disegnabile che è inclusa anche nel file XML.

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

6

Ti suggerirei di utilizzare il mio metodo per ottenere un ID risorsa. È molto più efficiente rispetto all'utilizzo del metodo getIdentidier (), che è lento.

Ecco il codice:

/**
 * @author Lonkly
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с) {

    Field field = null;
    int resId = 0;
    try {
        field = с.getField(variableName);
        try {
            resId = field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resId;

}

Non funzionerà per tutti i casi. Ad esempio se hai <string name = "string.name"> content </string>, la classe R.string avrà un campo string_name. E il tuo metodo non funzionerà in questo punto.
ddmytrenko,

3
Inoltre il tuo metodo non è veloce in realtà. Perché la serializzazione della classe Java non funziona mai rapidamente.
ddmytrenko,

5
// image from res/drawable
    int resID = getResources().getIdentifier("my_image", 
            "drawable", getPackageName());
// view
    int resID = getResources().getIdentifier("my_resource", 
            "id", getPackageName());

// string
    int resID = getResources().getIdentifier("my_string", 
            "string", getPackageName());

0

Ho trovato questa classe molto utile da gestire con le risorse. Ha alcuni metodi definiti per gestire dimens, colori, drawable e stringhe, come questo:

public static String getString(Context context, String stringId) {
    int sid = getStringId(context, stringId);
    if (sid > 0) {
        return context.getResources().getString(sid);
    } else {
        return "";
    }
}

wikipedia dice che Kotlin è apparso per la prima volta nel 2011, mi puoi dire come questa domanda è stata posta nel 2010, ed è stata dichiarata per Android nel 2019, come è stata posta la domanda di Kotlin per Android nel 2010
Abhinav Chauhan

0

oltre alla soluzione @lonkly

  1. vedere le riflessioni e l'accessibilità del campo
  2. variabili non necessarie

metodo:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g R.drawable.class or R.raw.class
 * @return integer id of resource
 */
public static int getResId(String variableName, Class<?> с)
                     throws android.content.res.Resources.NotFoundException {
    try {
        // lookup field in class 
        java.lang.reflect.Field field = с.getField(variableName);
        // always set access when using reflections  
        // preventing IllegalAccessException   
        field.setAccessible(true);
        // we can use here also Field.get() and do a cast 
        // receiver reference is null as it's static field 
        return field.getInt(null);
    } catch (Exception e) {
        // rethrow as not found ex
        throw new Resources.NotFoundException(e.getMessage());
    }
}

wikipedia dice che Kotlin è apparso per la prima volta nel 2011, mi puoi dire come questa domanda è stata posta nel 2010, ed è stata dichiarata per Android nel 2019, come è stata posta la domanda di Kotlin per Android nel 2010
Abhinav Chauhan

0

A Kotlin il seguente funziona bene per me:

val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())

Se la risorsa si trova nella cartella mipmap, è possibile utilizzare il parametro "mipmap" anziché "drawable".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.