我已经知道如何更改应用程序的语言(更新配置)。我的代码还检查系统是否更改了配置并在'onCreate'方法中“修复它”。我甚至创建了一个ListPreference,让用户通过我的应用程序支持的语言决定语言(并保存决定)。
假设我有3个活动(A,B和SettingsActivity)。活动A可以启动活动B和SettingsActivity。活动B可以启动SettingsActivity。如果用户更改了SettingsActivity中的语言,我可以使用此代码更新其资源(在本例中为Strings):
//if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) {
// Disabled because it blinks and looks bad
// recreate();
// } else {
startActivity(getIntent());
finish();
overridePendingTransition(0, 0);
// }
但是,我无法更改已经打开的活动,因为我没有从SettingsActivity中引用它们。
我的问题:是否有任何干净的方式来更新资源或重新创建已经开放的活动?如果我找不到更好的解决方案,我的方法将是上述方法之一:
startActivityForResult
启动活动并返回代码以触发我已用于重新创建活动的代码。onResume
方法内部进行检查。答案 0 :(得分:0)
最后我做的是:
@Override
protected void onStart() {
super.onStart();
if (!locale.equals(getResources().getConfiguration().locale)) {
finish();
startActivity(getIntent());
overridePendingTransition(0, 0);
return;
}
}
其中locale
是我onCreate
方法中指定的变量:
private Locale locale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((Application) getApplication()).refreshLanguage();
locale = getResources().getConfiguration().locale;
setContentView(R.layout.activity_main);
//moar code
}
最后,为了发布代码,这是我的refreshLanguage
方法:
boolean refreshLanguage() {
return refreshLanguage(PreferenceManager.getDefaultSharedPreferences(this));
}
boolean refreshLanguage(SharedPreferences sharedPreferences) {
if (sharedPreferences.contains("language")) {
int languageIndex = Integer.parseInt(sharedPreferences.getString("language", "0"));
if (!getResources().getConfiguration().locale.equals(languages[languageIndex])) {
Configuration config = new Configuration();
config.locale = languages[languageIndex];
getResources().updateConfiguration(config, null);
return true;
}
}
return false;
}
请注意,我使用的是onStart
而不是onResume
,因为我没有在透明活动之间切换或使用对话框。