我正在寻找一种动态更改字符串资源值的方法。我曾试图使用反射,但声称“字段值无效”。
我在布局中使用字符串作为值,但需要将它们换成不同的语言。
请参阅下面附带的代码。
public class Lang{
public static void langInit(){
java.lang.reflect.Field[] langStringFields = R.string.class.getFields();
Log.d(Global.TAG,"--> Lang Listing: " + langStringFields.length);
Log.d(Global.TAG,"--> Pref for language:");
String prefInLang = Prefs.cPrefsGet.getString("in_lang","en");
String fieldName = null;
String fieldValue = null;
String newFieldName = null;
String tmpA = "one";
for (int i=0; i<langStringFields.length; i++){
java.lang.reflect.Field field = langStringFields[i];
fieldName = field.getName();
try {
fieldValue = Global.gActivity.getString(field.getInt(R.string.class));
} catch (Exception e) {
e.printStackTrace();
}
if (fieldName.substring(0,2).equals("lo")){
try {
newFieldName = R.string.class.getField(prefInLang + "_" + fieldName.substring(3)).getName();
} catch (Exception e) {
e.printStackTrace();
}
Log.d(Global.TAG,"--> Field: " + fieldName + "value: " + fieldValue + "new field:" + newFieldName);
try {
java.lang.reflect.Field field2 = Class.forName(R.string.class.getName()).getDeclaredField(newFieldName);
field2.setAccessible(true);
field2.set(R.string.class,tmpA.toString());
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:3)
使用android中引入的localization内置机制。你不需要改变任何东西。您只需为每个语言环境指定新的strings.xml。
答案 1 :(得分:2)
如果您想更改应用的当前语言,可以使用标准的内置本地化功能和changing locale programatically来完成。
答案 2 :(得分:1)
您应该在资源中添加区域设置值并复制它们:每种语言一个,这样设备就可以根据设置选择正确的设置:在那里查看http://developer.android.com/resources/tutorials/localization/index.html
答案 3 :(得分:1)
我相信使用Android的内置本地化功能比手动实现更好。以下是您可以参考的指南:
http://developer.android.com/guide/topics/resources/localization.html
当然,除非我们误解了您的用例,但它确实听起来像您正在尝试进行标准本地化: - )
Bruno Oliveira,Google开发人员程序工程师