Android: Как получить строку из ресурсов, используя ее имя? - PullRequest
495 голосов
/ 21 сентября 2011

Я хотел бы иметь 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.

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

Ответы [ 12 ]

979 голосов
/ 21 сентября 2011

Ссылка, на которую вы ссылаетесь, похоже, работает со строками, сгенерированными во время выполнения.Строки из strings.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 являются резервными, если у вас нет папки, охватывающей языковой стандарт пользователя, эта будет использоваться в качестве значений по умолчанию.

См. Локализация и Предоставление ресурсов для получения дополнительной информации.

293 голосов
/ 22 июля 2012

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

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }
64 голосов
/ 20 ноября 2015

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

    public static String byIdName(Context context, String name) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
    }
37 голосов
/ 13 июня 2013
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
25 голосов
/ 08 мая 2013

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

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

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

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

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

10 голосов
/ 27 апреля 2015

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

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
8 голосов
/ 11 июля 2018

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

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
        android:name=".App"
        ...
        >
        ...
    </application>

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

7 голосов
/ 16 декабря 2015

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

getContext().getString(R.string.your_string_name);
4 голосов
/ 20 апреля 2016

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

getString(android.R.string.ok)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...