Change value of R.string programmatically?
我正在寻找一种动态更改字符串资源的值的方法。 我尝试使用反射,但是它声称"字段的无效值"。
我将字符串用于布局中的值,但需要将它们换成不同的语言。
请参阅下面的附加代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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(); } } } } } |
使用android中引入的内置本地化机制。您无需更改任何内容。您只需要为每个语言环境指定新的strings.xml。
如果您想为您的应用更改当前语言,则可以使用标准的内置本地化功能并以编程方式更改区域设置。
我相信使用Android的内置本地化功能要比手工实现更为可取。您可以参考以下指南:
http://developer.android.com/guide/topics/resources/localization.html
除非,当然,除非我们误解了您的用例,但这听起来确实像您正在尝试进行标准本地化:-)
Google开发人员计划工程师Bruno Oliveira
您应该在资源中添加一个语言环境值并复制它们:一种用于每种语言,从而让设备根据其设置选择正确的语言:在此处进行检查http://developer.android.com/resources/tutorials/localization /index.html