Изменять значение R.string программно - программирование
Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

пример 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 Мое приложение поддерживает многие языки, поэтому я хотел взять string из моего strings.xml, который в настоящее время используется и изменяет это, а затем воспользуйся этим - atuljangra 12 мар 12 в 22:04

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

то u имеет 2 варианта:

  • "встроить" зависящий от системы выбор языка - на основе выбранного устройства lang
  • через создание ресурсов для конфигурации - вы решаете, какой lang показать

вот так:

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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