语言更改时修复资源

时间:2013-11-03 06:20:02

标签: android android-activity locale

我已经知道如何更改应用程序的语言(更新配置)。我的代码还检查系统是否更改了配置并在'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中引用它们。

我的问题:是否有任何干净的方式来更新资源或重新创建已经开放的活动?如果我找不到更好的解决方案,我的方法将是上述方法之一:

  1. 使用startActivityForResult启动活动并返回代码以触发我已用于重新创建活动的代码。
  2. 如果当前语言已更改并执行相同操作,请在onResume方法内部进行检查。

1 个答案:

答案 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,因为我没有在透明活动之间切换或使用对话框。