在应用启动期间设置区域设置

时间:2017-07-20 21:29:41

标签: android

当用户通过更新配置并重新启动应用程序在对话框中选择语言时,我设法在启动期间更改应用程序区域设置。

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();
}

2 个答案:

答案 0 :(得分:1)

尝试将其添加到Application OnCreate()方法。

答案 1 :(得分:1)

如果您想为某项活动执行此操作,则可以在活动中覆盖changeAppLanguage(getLanguageCode()) attachBaseContext(Context)

通常,仅在活动中执行此操作并不足以完全应用区域设置。我最终实施的是基于这两个帖子的解决方案:

我在这些地方拨打了LocalHelper.onAttach(context) / LocaleManager.setLocale(context) / whatever you call it的电话:

  1. 活动attachBaseContext()

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleUtil.setLocale(base));
    }
    
  2. 应用程序attachBaseContext()(与活动相同)

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleUtil.setLocale(base));
    }
    
  3. 应用程序onConfigurationChanged()

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleUtil.setLocale(this);
    }
    
  4. 在我的SharedPreferences.OnSharedPreferenceChangeListener实施

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (LocaleUtil.SELECTED_LANGUAGE.equals(key)) {
            context = LocaleUtil.setLocale(context);
            ...
        }
    }