Изменить значение R.string программно - PullRequest
24 голосов
/ 13 марта 2012

Я объявил строку в своем файле strings.xml и использую ее в своей деятельности как R.string.compose_title. (установка его в качестве заголовка, т.е. setTitle (R.id.compose_title)). Теперь в некоторых случаях я хочу отредактировать строку, а затем использовать ее для установки заголовка. Как я могу это сделать?

P.S. Мне нужно изменить значение только одной строки, поэтому объявление нового strings.xml для каждого случая (которые зависят от пользователя) с использованием локализации кажется неэффективным.

Ответы [ 7 ]

45 голосов
/ 13 марта 2012

Здесь вы должны понять одну вещь: когда вы предоставляете данные в качестве ресурса, они не могут быть изменены во время выполнения. Например, то, что у вас есть в папке для рисования, не может быть изменено во время выполнения. Если быть точным, папка res не может быть изменена программно.

Это относится и к Strings.xml, то есть к папке «Значения». Если вам вообще нужна строка, которую нужно изменить во время выполнения, создайте отдельный класс и поместите ваши строки в этот класс и получите доступ во время выполнения. Это лучшее решение, которое я нашел.

4 голосов
/ 21 марта 2017

пример howto:

как? путем изменения одной ссылки на переменную на другую ссылку

использование:

setRColor(pl.mylib.R.class,"endColor",pl.myapp.R.color.startColor);
// override app_name in lib R class  
setRString(pl.mylib.R.class,"app_name",pl.myapp.R.string.app_name);

базовые методы:

public static void setRColor(Class rClass, String rFieldName, Object newValue) {
    setR(rClass, "color", rFieldName, newValue);
}

public static void setRString(Class rClass, String rFieldName, Object newValue) {
    setR(rClass, "string", rFieldName, newValue);
}

// AsciiStrings.STRING_DOLAR = "$";
public static void setR(Class rClass, String innerClassName, String rFieldName, Object newValue) {
    setStatic(rClass.getName() + AsciiStrings.STRING_DOLAR  + innerClassName, rFieldName, newValue);
}

вспомогательные методы:

public static boolean setStatic(String aClassName, String staticFieldName, Object toSet) {
    try {
        return setStatic(Class.forName(aClassName), staticFieldName, toSet);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}

public static boolean setStatic(Class<?> aClass, String staticFieldName, Object toSet) {
    try {
        Field declaredField = aClass.getDeclaredField(staticFieldName);
        declaredField.setAccessible(true);
        declaredField.set(null, toSet);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

@ bradenV2 Мое приложение поддерживает множество языков, поэтому я хотел взять строка из моего strings.xml, который используется в настоящее время, и измените его, и затем используйте это - atuljangra 12 марта 12 в 22: 04

ps вышеприведенное решение хорошо, например, когда вы хотите вставить некоторые данные в уже скомпилированный lib / jar. Но если вы хотите локализовать строки, просто создайте папку в res для LANG CODE, например values-CC, где cc - это код lang (values-de, values-cs) и т. Д.

тогда у вас есть 2 варианта:

  1. «встроенный» системно-зависимый выбор языка - в зависимости от выбранного устройства lang
  2. через создание ресурсов для конфигурации - вы решаете, какой lang show

вот так:

configuration = new Configuration(resources.getConfiguration());
configuration.setLocale(targetLocale);
String localized = Context.createConfigurationContext(configuration)
    .getResources()
    .getString(resourceId);

enter image description here

4 голосов
/ 13 марта 2012

Я не думаю, что вы можете программно настроить класс R , так как он создается ADT автоматически.

1 голос
/ 13 марта 2012

У меня была такая ситуация, когда в одном из моих значений strings.xml был какой-то динамический фрагмент.Я установил strings.xml с «текстом замены» (что-то вроде %%REPLACEMENT_EMAIL%%), и когда я хотел использовать эту строку программно, я извлек строковое значение ресурса и заменил экземпляры этого текста замены динамическимзначение (например, введенное пользователем).

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

0 голосов
/ 19 июня 2017

Используйте SharedPreferences вместо класса Java. Это даст вам больше универсальности, если вы решите взять значения извне (Интернет). Заполнение Java-класса во время выполнения может быть бесполезным в автономном режиме. В случае SharedPreferences вы должны убедиться, что они загружаются только один раз, при первом запуске приложения, а затем обновляются только по запросу вручную, так как будет использоваться предыдущий импорт.

myActivity.getSharedPreferences("com.example.imported",0)
.edit()
.putString("The news",getTheNews())
.apply();
0 голосов
/ 06 мая 2016

Насколько мне известно, вы не можете изменить значение ресурса (значение класса R) во время работы приложения.почему бы не попробовать хранить на общих предпочтениях?Я рекомендую вам использовать общие предпочтения

0 голосов
/ 06 октября 2015

Может быть, вы захотите «изменить» string.xml, чтобы при повторном использовании действия он использовал новое значение, например, чтобы сохранить новый динамический заголовок после поворота экрана.

Во-первых, вы не можете изменить ресурс.Это уже скомпилировано.Вы не можете изменить класс R (для чего?), Все его атрибуты являются "окончательными".

Таким образом, для приведенного выше примера вы можете использовать onSaveInstanceState () и onRestoreInstanceState () для тех свойств, которые вы хотите оставить на дисплее.

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