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

Я хотел бы иметь 2 языка для пользовательского интерфейса и отдельные строковые значения для них в моем файле ресурсов resvaluesstrings.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.

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

11 ответов


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

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

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

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

посмотреть локализация и Выделение Ресурсов для получения дополнительной информации.


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

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

не только от деятельности:

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

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

Я бы добавил что-то к решению 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);
    }
}

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

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

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

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


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

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

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

getString(android.R.string.ok)

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


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

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

Лучший Уникальный Подход

is App.getRes().getString(R.string.some_id) что будет работать везде в приложении.

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

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

String myString = getString (R. строка.mystring совсем);

легко