我创建了一个活动来更改应用程序的区域设置以加载所选语言的资源,并重新启动应用程序,此外,通过以下代码设置语言环境后,我将使用sharedpreferences作为应用程序状态保留整数值,下次我打开应用程序时,所提到的状态没有正确的值!!!!但是,当我删除语言设置时,应用程序的状态没有任何问题!
myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf,dm); /* * Intent refresh = new Intent(this,AndroidLocalizeActivity.class); * startActivity(refresh); finish(); */ PrefManager _p = new PrefManager(getApplicationContext(),PrefConfigNames.LANGUAGE_APP_CONFIG); _p.setStringValue(GeneralPrefKeyNames.LANGUAGE,lang); Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); setResult(RESULT_OK,null); finish();
我无法得到共享引用会发生什么(我在这个应用程序中使用了开放源代码安全指引(CodeProject article))
这里!!!
提前致谢
编辑#1
PrefManager.java
public class PrefManager { private SecurePreferences _securePreferences = null; public PrefManager(Context context,String PrefName) { _securePreferences = new SecurePreferences(context,PrefName); } public void setStringValue(String key,String value) { _securePreferences.edit().putString(key,value).commit(); } }
编辑#2
令人奇怪的是,当我从eclipse调试或运行应用程序(调试或作为Android应用程序运行)时,存储在sharedpref中的应用程序的状态具有正确的值!!!但是当我在手机上重新运行它时有默认值!!!请帮我解决这个问题!
编辑#3
我发现使用以下行重新启动应用程序存在问题,是否有另一种重新启动应用程序的方法没有任何问题?甚至更好的方式(更新语言,而不重新启动应用程序)?
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i);
Changing locale: Force activity to reload resources?
,但不是在以下行之后提高
res.updateConfiguration(conf,dm);
提前致谢
解决方法
我终于得到了解决方案,在onPause方法中,我将当前保存的语言保存在sharedprefs中,并在更改设置活动中的语言环境并返回到onResume方法中的上一个活动后,将新保存的lang与保存在onPause,如果这两个不相等,我将重新创建方法.
@Override protected void onResume() { super.onResume(); SharedPreferences _sPreferences = getSharedPreferences(PrefConfigNames.LANGUAGE_APP_CONFIG,Context.MODE_PRIVATE); String resumeLang = _sPreferences.getString(GeneralPrefKeyNames.LANGUAGE,"En"); if (!currentLang.equals(resumeLang)) recreate(); }; @Override protected void onPause() { SharedPreferences _sPreferences = getSharedPreferences(PrefConfigNames.LANGUAGE_APP_CONFIG,Context.MODE_PRIVATE); currentLang = _sPreferences.getString(GeneralPrefKeyNames.LANGUAGE,"En"); super.onPause(); };