以编程方式更改R.string的值
我已经在我的strings.xml文件中声明了一个string,并在我的活动中使用它作为R.string.compose_title。 (将其设置为title,即setTitle(R.id.compose_title))。 现在在某些情况下,我想编辑string,然后用它来设置标题。 我该怎么做?
PS我只需要改变一个string的值,所以使用本地化为每个case(这是可变的,取决于用户)声明一个新的strings.xml似乎是一个低效的。
有一件事你必须明白的是,当你提供一个数据作为一个资源,它不能在运行时修改。 例如,绘图文件夹中的绘图不能在运行时修改。 确切地说,“res”文件夹不能以编程方式修改。
这也适用于Strings.xml,即“值”文件夹。 如果您想要一个必须在运行时修改的string,请创build一个单独的类,并将您的string放置在此类中并在运行时访问。 这是我find的最好的解决scheme。
我不认为你可以编程自定义R类,因为它是由ADT自动构build的。
示例如何:
怎么样? 通过改变一个variables引用到其他引用
用法:
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中取出一个string,然后改变它,然后使用那个 – atuljangra 12年3月12日在22:04
PS上面的解决scheme是很好的,例如,当你想注入已编译的lib / jar中的一些数据。 但是,如果你想要本地化string只是使文件夹下的每个LANG代码像值CC,其中cc是lang代码(values-de,values-cs)等
那么你有2个select:
- “内置”系统相关的语言select – 基于select的设备语言
- 通过创buildconfiguration资源 – 您决定显示哪个lang
喜欢这个:
configuration = new Configuration(resources.getConfiguration()); configuration.setLocale(targetLocale); String localized = Context.createConfigurationContext(configuration) .getResources() .getString(resourceId);
我有这样的情况,其中我的一个strings.xml值有一些dynamic的一块。 我使用“replace文本”(类似于%%REPLACEMENT_EMAIL%%
)设置了strings.xml,当我想以编程方式使用该string时,我检索到资源的string值,并用replace文本的实例replacedynamic值(例如由用户input)。
说实话,我的应用程序还没有被本地化,但我仍然试图遵循最佳实践,而不是硬编码任何string。
也许你想“修改”string.xml,所以当它再次被活动需要时,它会使用新值,例如在屏幕旋转后保留一个新的dynamic标题。
首先,你不能修改资源。 已经编译好了 你不能修改R类(为什么?)所有它的属性是“最终的”。
因此,对于上面的示例,您可以使用onSaveInstanceState()和onRestoreInstanceState()来显示要保留的属性。
据我所知,在app运行的时候不能改变资源值(R class值)。 为什么不试图存储共享偏好? 我build议你使用共享偏好
使用SharedPreferences而不是Java类。 它会给你更多的多function性,如果你决定从外部 (networking)的价值。 在运行时填充Java类可能是无用的离线。 在SharedPreferences的情况下,您必须确保在应用程序的第一次启动过程中仅加载一次,然后仅通过手动请求进行更新,因为将使用之前的导入。
myActivity.getSharedPreferences( "com.example.imported", 0) .edit() .putString( "The news", getTheNews()) .apply();