当用户通过更新配置并重新启动应用程序在对话框中选择语言时,我设法在启动期间更改应用程序区域设置。
private void changeAppLanguage(String languageCode) {
Locale locale = new Locale(languageCode);
Locale.setDefault(locale);
Resources resources = mContext.getResources();
Configuration configuration = resources.getConfiguration();
// minSdkVersion: 16
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
private void restartActivity() {
finish();
Intent iMainActivity = getIntent();
startActivity(iMainActivity);
}
但是,在冷启动应用中,我无法在MainActivity启动之前设置之前的:它只是不会加载正确的字符串资源而我不能/不能t想在第一次启动时重启活动!
我不确定我做错了什么,因为我已经尝试在changeAppLanguage()
中的不同订单中调用onCreate()
。
@Override
protected void onCreate(Bundle savedInstanceState) {
changeAppLanguage(getLanguageCode());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
variousSetups();
}
答案 0 :(得分:1)
尝试将其添加到Application OnCreate()方法。
答案 1 :(得分:1)
如果您想为某项活动执行此操作,则可以在活动中覆盖changeAppLanguage(getLanguageCode())
attachBaseContext(Context)
。
通常,仅在活动中执行此操作并不足以完全应用区域设置。我最终实施的是基于这两个帖子的解决方案:
我在这些地方拨打了LocalHelper.onAttach(context)
/ LocaleManager.setLocale(context)
/ whatever you call it
的电话:
活动attachBaseContext()
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleUtil.setLocale(base));
}
应用程序attachBaseContext()
(与活动相同)
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleUtil.setLocale(base));
}
应用程序onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleUtil.setLocale(this);
}
在我的SharedPreferences.OnSharedPreferenceChangeListener
实施
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (LocaleUtil.SELECTED_LANGUAGE.equals(key)) {
context = LocaleUtil.setLocale(context);
...
}
}