Android getIdentifier не работает для строки?
Я действительно не знаю, почему, но я не могу получить идентификатор строки.
Это мой код:
int resId = getApplicationContext().getResources()
.getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
Но он отлично работает для всех других классов файла R:
int resId = getApplicationContext().getResources()
.getIdentifier("arrow","drawable", "com.yoki.android.cat");
Итак, я действительно не понимаю, что происходит здесь, какие-то идеи?
Ответы
Ответ 1
Этот код выглядит как правильный код:
int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
и он должен работать, но если не советую, не пытайтесь обойти это и попытаться понять, почему он не работает:
1) Прежде всего, попробуйте найти следующее декларируемое поле в проекте/проектах:
About_EmailPrompt
если вы используете затмение, вы должны нажать Ctrl + H и открыть вкладку "Поиск по Java"
![Java Search Dialog]()
Если вы получите результаты поиска, перейдите к шагу 2, в противном случае перейдите к шагу 3
2) Вы должны получить результат как иерархию
<YOUR_PACKAGE_NAME>
-- R
-- string
-- About_EmailPrompt
2.1) проверьте, что вы пишете правильное имя пакета в своем коде
.getIdentifier("About_EmailPrompt", "string", <YOUR_PACKAGE_NAME>);
2.2) проверьте, что вы используете только латинские символы в своих буквальных строках:
"About_EmailPrompt"
и
"string"
2.3) проверьте, что вы используете только латинские символы в атрибуте name
в strings.xml
<string name="About_EmailPrompt">SOME_VALUE</string>
3) Если у вас нет результатов поиска
3.1) проверьте, что вы используете только латинские символы в своей литеральной строке:
"About_EmailPrompt"
3.2) проверьте, что вы используете только латинские символы в атрибуте name
в strings.xml
<string name="About_EmailPrompt">SOME_VALUE</string>
3.3) Очистите и создайте для всех проектов, которые у вас есть
P.S. Если это вам не поможет, попробуйте перезапустить среду IDE (иногда eclipse генерирует R.java неправильно до перезапуска)
Ответ 2
В качестве альтернативного подхода вы можете использовать отражение:
R.string.class.getField("string_name").getInt(null);
Что по сути делает трюк, получая поле класса по имени, а затем получая целочисленное значение.
Мы передаем null как объект, потому что все генерируемые ресурсами поля являются статическими и, следовательно, не являются частью объекта.
Вам может потребоваться обработать несколько исключений (NoSuchFieldException и т.д.), если вы сделали опечатку, но она работает.
Ответ 3
Мне удалось получить рабочее решение в моем приложении. Итак, исходя из исходного вопроса, вам нужно будет изменить его следующим образом:
int resId = getApplicationContext().getResources()
.getIdentifier("com.yoki.android.cat:string/About_EmailPrompt", null, null);
Это еще один способ записи метода getIdentifier(), но, похоже, он работает таким образом.
Ответ 4
Вы можете создать метод для замены всех getIdentifier
-коллекций. Кроме того, вам нужно смешивать два разных подхода, что делает код немного неясным.
Этот подход аналогичен решению @shalafi и использует отражение.
public static int getResId(String variableName, Class<?> c) {
try {
Field idField = c.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
и используйте его следующим образом:
getResId("About_EmailPrompt", R.string.class); //or for other things
getResId("icon", R.drawable.class);
<ч/" > Если вы используете
public static int getResStringId(String variableName) {
try {
Field idField = R.string.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
он даже быстрее, чем getIdentifier()
или вышеупомянутое решение. Источник
Ответ 5
У меня есть следующие функции:
public static int getDrawable(Context context, String name)
{
Assert.assertNotNull(context);
Assert.assertNotNull(name);
return context.getResources().getIdentifier(name,
"drawable", context.getPackageName());
}
public static int getString(Context context, String name)
{
Assert.assertNotNull(context);
Assert.assertNotNull(name);
return context.getResources().getIdentifier(name,
"strings", context.getPackageName());
}
Я думаю, вы должны использовать строки вместо строки