Изменять значение R.string программно
Я объявил строку в файле strings.xml и использовал ее в своей деятельности как R.string.compose_title. (устанавливая его как заголовок, т.е. setTitle (R.id.compose_title)). Теперь в каком-то случае я хочу отредактировать строку, а затем использовать ее для установки заголовка. Как я могу это сделать?
P.S. Мне нужно изменить значение только одной строки, поэтому объявление нового файла strings.xml для каждого случая (которое зависит от пользователя) с использованием локализации, похоже, неэффективно.
Ответы
Ответ 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();