Como obter uma identificação de recurso com um nome de recurso conhecido?

Respostas:

149

Será algo como:

R.drawable.resourcename

Certifique-se de não Android.Rimportar o espaço para nome, pois isso pode confundir o Eclipse (se é isso que você está usando).

Se isso não funcionar, você sempre pode usar o getResourcesmétodo de um contexto ...

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

Onde this.contextestá intialised como um Activity, Serviceou qualquer outra Contextsubclasse.

Atualizar:

Se é o nome que você deseja, a Resourcesclasse (retornada por getResources()) possui um getResourceName(int)método e um getResourceTypeName(int)?

Atualização 2 :

A Resourcesclasse possui este método:

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

Que retorna o número inteiro do nome, tipo e pacote do recurso especificado.

Raivoso
fonte
Thankq pela sua resposta .R.drawable.resourcename eu estou usando agora eu preciso para obter o seu valor inteiro, passando resourcename
Aswan
2
R.drawable.resourcename é o número inteiro
Rabid
Oi Rabid.what você disse que é existe alguma maneira, acessando valor .resource R.drawable por resouce passando
Aswan
Eu preciso que o valor inteiro, passando resourcename dinamicamente
Aswan
Thankq assim que eu quero e eu quero começar de recursos drawable id.how I wil a ele
Aswan
340

Se eu entendi direito, é isso que você quer

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

Onde "this" é uma Atividade, escrita apenas para esclarecer.

Caso você queira uma String em strings.xml ou um identificador de um elemento da interface do usuário, substitua "drawable"

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

Eu aviso, essa maneira de obter identificadores é realmente lenta, use somente quando necessário.

Link para a documentação oficial: Resources.getIdentifier (Nome da string, String defType, String defPackage)

Maragues
fonte
3
Isso é muito útil no contexto de escrever testes para se certificar existem certas cordas ou etc.
Ehtesh Choudhury
1
Eu não conheço cara, eu adicionei um Log antes e depois de getIdentifier () com timestamp e ele me mostrou que é executado em 0 - 1 ms! Portanto, não é lento, é super rápido! Estou usando-o para obter imagens de recursos e funciona perfeitamente. Testado no Nexus5x.
precisa saber é o seguinte
1
@KirillKarmazin: O Nexus5X é um telefone decentemente rápido, e 1ms para essa ligação é bastante lento. Lembre-se de que cada quadro da interface do usuário tem apenas 16ms.
Mooing Duck
A wikipedia diz que o kotlin apareceu pela primeira vez em 2011, como você pode responder a uma pergunta sobre isso em 2010
Abhinav Chauhan
25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
user1393422
fonte
15

Kotlin VersionviaExtension Function

Para localizar uma identificação de recurso pelo nome No Kotlin, adicione o trecho abaixo em um arquivo 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

Agora todos os IDs de recursos estão acessíveis onde quer que você tenha uma referência de contexto usando o resIdByNamemétodo:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    
aminografia
fonte
A wikipedia diz que o kotlin apareceu pela primeira vez em 2011, você pode me dizer como essa pergunta foi feita em 2010 e foi declarada para android em 2019, como ele é perguntado sobre a pergunta do android kotlin em 2010
Abhinav Chauhan
14

Uma maneira simples de obter o ID do recurso da string. Aqui resourceName é o nome do recurso ImageView na pasta drawable que também está incluída no arquivo 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);
Muhammad Adil
fonte
6

Eu sugiro que você use meu método para obter uma identificação de recurso. É muito mais eficiente do que usar o método getIdentidier (), que é lento.

Aqui está o código:

/**
 * @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;

}
Lonkly
fonte
Não funcionará para todos os casos. Por exemplo, se você tiver <string name = "string.name"> conteúdo </string> que a classe R.string, terá um campo string_name. E seu método não funcionará neste ponto.
ddmytrenko
3
Além disso, seu método não é rápido, na verdade. Porque a serialização de classe Java nunca está funcionando 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());
Manthan Patel
fonte
0

Eu achei essa classe muito útil para lidar com recursos. Possui alguns métodos definidos para lidar com dimens, cores, drawables e strings, como este:

public static String getString(Context context, String stringId) {
    int sid = getStringId(context, stringId);
    if (sid > 0) {
        return context.getResources().getString(sid);
    } else {
        return "";
    }
}
Diego Malone
fonte
A wikipedia diz que o kotlin apareceu pela primeira vez em 2011, você pode me dizer como essa pergunta foi feita em 2010 e foi declarada para android em 2019, como ele é perguntado sobre a pergunta do android kotlin em 2010
Abhinav Chauhan
0

além da solução @lonkly

  1. veja reflexões e acessibilidade em campo
  2. variáveis ​​desnecessárias

método:

/**
 * 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());
    }
}
ceph3us
fonte
A wikipedia diz que o kotlin apareceu pela primeira vez em 2011, você pode me dizer como essa pergunta foi feita em 2010 e foi declarada para android em 2019, como ele é perguntado sobre a pergunta do android kotlin em 2010
Abhinav Chauhan
0

No Kotlin, o seguinte funciona bem para mim:

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

Se o recurso estiver na pasta mipmap, você poderá usar o parâmetro "mipmap" em vez de "drawable".

Jens van de Mötter
fonte