以编程方式更改R.string的值

atu*_*gra 25 string resources android

我在strings.xml文件中声明了一个字符串,并在我的活动中将其用作R.string.compose_title.(将其设置为标题,即setTitle(R.id.compose_title)).现在在某些情况下我想编辑字符串然后用它来设置标题.我怎样才能做到这一点 ?

PS我只需要更改单个字符串的值,因此使用本地化为每种情况(根据用户而变化)声明一个新的strings.xml似乎效率低.

And*_*lva 47

您需要了解的一件事是,当您将数据作为资源提供时,无法在运行时修改它.例如,在drawable文件夹中的drawables无法在运行时修改.确切地说,无法以编程方式修改"res"文件夹.

这也适用于Strings.xml,即"Values"文件夹.如果您想要一个必须在运行时修改的String,请创建一个单独的类,并将您的字符串放在此类中并在运行时访问.这是我发现的最佳解决方案.


cep*_*3us 8

示例方法:

如何?通过将一个变量引用更改为另一个引用

用法:

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);
Run Code Online (Sandbox Code Playgroud)

基本方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

辅助方法:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

@bradenV2 我的应用程序支持多种语言,因此我想从当前使用的 strings.xml 中获取一个字符串并更改它,然后使用该字符串 – atuljangra 12 年 3 月 12 日 22:04

ps 上面的解决方案很好,例如当你想在已经编译的 lib/jar 中注入一些数据时。但是,如果您想本地化字符串,只需在每个 LANG 代码的res下创建文件夹,例如 values-CC,其中 cc 是 lang 代码(values-de,values-cs)等

那么你有2个选择:

  1. “内置”系统相关语言选择 - 基于设备选择的语言
  2. 通过为配置创建资源 - 您决定显示哪个语言

像这样:

configuration = new Configuration(resources.getConfiguration());
configuration.setLocale(targetLocale);
String localized = Context.createConfigurationContext(configuration)
    .getResources()
    .getString(resourceId);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


waq*_*lam 5

我认为您不能以编程方式自定义R类,因为它是由 ADT 自动构建的。