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

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

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

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

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

Я не думаю, что вы можете программно настроить class 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 вышеупомянутое решение хорошо, например, когда u хочет вставлять некоторые данные в уже скомпилированный lib / jar. Но если вы хотите локализовать строки, просто создайте папку под res для LANG CODE, например, значения CC, где cc – код lang (values-de, values-cs) и т. Д.

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

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

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

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

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

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

 myActivity.getSharedPreferences( "com.example.imported", 0) .edit() .putString( "The news", getTheNews()) .apply(); 
  • Строковые литералы const?
  • Проверка значения null перед ToString ()
  • Загружать конкретную строку языка из ресурса?
  • Какова максимальная длина строки .NET?
  • Давайте будем гением компьютера.