Измените значение R.string программно

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

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

Solutions Collecting From Web of "Измените значение R.string программно"

Одна вещь, которую вы должны понимать здесь, заключается в том, что когда вы предоставляете данные в качестве Ресурса, ее нельзя изменить во время выполнения. Например, чертежи, которые вы имеете в вашей папке с возможностью копирования, не могут быть изменены во время выполнения. Если быть точным, папка «res» не может быть изменена программно.

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

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

Пример 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 per LANG CODE, например, значения CC, где cc – код lang (значения-de, values-cs) и т. Д.

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

  1. «Встроить» зависящий от системы выбор языка – на основе выбранного устройства
  2. Через создание ресурсов для конфигурации – вы решаете, какой из них показывать

как это:

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

Введите описание изображения здесь

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

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

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

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

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

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

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

 myActivity.getSharedPreferences( "com.example.imported", 0) .edit() .putString( "The news", getTheNews()) .apply();