Подтвердить что ты не робот

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

Итак, я действительно не понимаю, что происходит здесь, какие-то идеи?

4b9b3361

Ответ 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());
    }

Я думаю, вы должны использовать строки вместо строки