Android: Как получить строку из ресурсов, используя ее имя?

Я хотел бы иметь 2 языка для пользовательского интерфейса и отдельные строковые значения для них в файле ресурсов res\values\strings.xml:

<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>

<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>

Теперь мне нужно динамически извлекать эти значения в моем приложении:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

Моя проблема в том, что i = 0.

Почему это не работает в моем случае?

Ответ 1

Ссылка, на которую вы ссылаетесь, похоже, работает со строками, сгенерированными во время выполнения. Строки из strings.xml не создаются во время выполнения. Вы можете получить их через

String mystring = getResources().getString(R.string.mystring);

getResources() - метод класса Context. Если вы находитесь внутри Activity или Service (которые расширяют контекст), вы можете использовать его, как в этом фрагменте.

Также обратите внимание на то, что всю зависимость языка можно позаботиться об инфраструктуре Android.. Просто создайте разные папки для каждого языка. Если английский язык по умолчанию, просто поместите английские строки в res/values/strings.xml. Затем создайте новую папку values-ru и поместите русские строки с одинаковыми именами в res/values-ru/strings.xml. С этого момента на android выбирается правильный вариант в зависимости от локали устройства для вас, либо при вызове getString(), либо при ссылках на строки в XML через @string/mystring. Те из res/values/strings.xml являются резервными, если у вас нет папки, охватывающей языковой стандарт пользователя, этот будет использоваться как значения по умолчанию.

Смотрите Localization и Предоставление ресурсов для более информация.

Ответ 2

У меня та же проблема. Но этот код ниже работает для меня: Проверьте правильность имени packageName. Вы должны обратиться за корневым пакетом своего приложения для Android.

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }

Ответ 3

Не только для действий:

    public static String byIdName(Context context, String name) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
    }

Ответ 4

getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))

Ответ 5

Я бы добавил что-то к решению leonvian, поэтому, если по какой-либо причине строка не найдена среди ресурсов (возвращаемое значение 0, это не допустимый код ресурса), функция может что-то вернуть:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources()
            .getIdentifier(aString, "string", packageName);
    if (resId == 0) {
        return aString;
    } else {
        return getString(resId);
    }
}

Ответ 6

Проще всего использовать функцию getString() внутри действия.

String myString = getString(R.string.mystring);

Ссылка: http://developer.android.com/guide/topics/resources/string-resource.html

Я думаю, что эта функция добавлена ​​в недавнюю версию Android, любой, кто знает историю, может прокомментировать это.

Ответ 7

Простой способ получить строку ресурса из строки в TextView. Здесь resourceName - это имя ресурса.

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);

Ответ 8

Лучший подход

App.getRes().getString(R.string.some_id)

Будет работать везде (Utils, Models также).

Я прочитал все ответы, все ответы могут сделать вашу работу.

  • Вы можете использовать getString(R.string.some_string_id) в Activity или Fragment.
  • Вы можете использовать Context.getString(R.string.some_string_id) где у вас нет прямого доступа к методу getString(). Нравится Dialog.

проблема

Когда у вас нет доступа к Context, как метод в вашем классе Util.

Предположим ниже метод без контекста.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

Теперь вы передадите Context в качестве параметра в этом методе и будете использовать getString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

Что я делаю

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

Какие? Это очень просто использовать в любом месте вашего приложения!

Итак, вот решение, с помощью которого вы можете получить доступ к ресурсам из любого места, например, Util class.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

Добавьте поле имени в ваш manifest.xml <application тег <application.

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Теперь вы готовы идти. Используйте App.getAppResources().getString(R.string.some_id) любом месте приложения.

Ответ 9

Если у вас нет ссылки на активность, вы можете использовать свой контекст таким образом:

getContext().getString(R.string.your_string_name);

Ответ 10

Существует также набор предопределенных Android-строк, таких как "Ok", "Cancel" и многие другие, поэтому вам не нужно объявлять все. Они доступны просто:

getString(android.R.string.ok)

(В этом случае строка "Ok" ). Кстати, есть и другие доступные для Android ресурсы, например, изображения значков и т.д.

Ответ 11

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

Ответ 13

String myString = getString (R.string.mystring);

Простой способ

Ответ 14

Для безопасности вы должны добавить: mContext.getResources(). GetString (R.string.your_string);

mContext может быть: контекст в onAttach() Fragment или this of Activity.

Ответ 15

Вы можете попробовать это в Деятельности:

getResources().getString(R.string.your string name);

В других ситуациях, таких как фрагменты,... используйте

getContext().getResources().getString(R.string.your string name);