Как преобразовать строку в идентификатор ресурса (Android Studio)

у меня есть строка xml в моем

    <string name="pokemon_d">150</string>

и у меня есть строка "150" в мой контроллер MainActivity.java. В моем MainActivity, как я могу преобразовать этот String к идентификатору ресурса строки pokemon_d в xml-файле? Это вообще возможно?

3 ответов


вы не можете получить идентификатор по значению, но вы можете сделать свое имя идентификатора похожим на значение и получить его по имени строки,

так что я предлагаю,

использовать строке имя ресурса, что-то вроде resource_150

<string name="resource_150">150</string>

вот здесь resource_ общий для записи строки , так в коде

String value = "150";
int resourceId = this.getResources().
             getIdentifier("resource_"+value, "string", this.getPackageName());

теперь resourceId значение равно R.string.resource_150

просто убедитесь, что здесь this представление контекста приложения. В вашем случае MainActivity.this будет работать.


Я нашел несколько советов здесь:Android, получение идентификатора ресурса из строки?

ниже пример, как получить строки и их значения, определенные в строках.XML. Единственное, что вам нужно сделать, это сделать цикл и проверить, какая строка содержит ваше значение. Если вам нужно повторить это много раз, может быть, лучше построить массив. //---------

    String strField = "";
    int resourceId = -1;
    String sClassName = getPackageName() + ".R$string";
    try {
        Class classToInvestigate = Class.forName(sClassName); 

        Field fields[] = classToInvestigate.getDeclaredFields();

        strField = fields[0].getName();     
        resourceId = getResourceId(strField,"string",getPackageName());

        String test = getResources().getString(resourceId);

        Toast.makeText(this,
                       "Field: " + strField + " value: " + test ,
                       Toast.LENGTH_SHORT).show();


    } catch (ClassNotFoundException e) {
            Toast.makeText(this,
                       "Class not found" ,
                       Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this,
                       "Error: " + e.getMessage() ,
                       Toast.LENGTH_SHORT).show();
    }


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

редактировать

вы не можете искать идентификатор ресурса по строковому значению. Вы можете сделать свою собственную карту значений и resourceIds и использовать ее в качестве таблицы поиска, но я считаю, что просто выбрать интеллектуальное соглашение об именах, как в принятом ответе, является лучшим решением.