Как преобразовать строку в идентификатор ресурса (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 и использовать ее в качестве таблицы поиска, но я считаю, что просто выбрать интеллектуальное соглашение об именах, как в принятом ответе, является лучшим решением.