1

我已经知道如何更改我的应用程序的语言(更新配置)。我的代码还检查配置是否被系统更改并在“onCreate”方法中“修复它”。我什至创建了一个 ListPreference 让用户使用我的应用程序支持的语言来决定语言(并保存决定)。

假设我有 3 个活动(A、B 和 SettingsActivity)。Activity A 可以启动 Activity B 和 SettingsActivity。Activity B 可以启动 SettingsActivity。如果用户更改 SettingsActivity 中的语言,我可以使用以下代码毫无问题地更新其资源(在本例中为字符串):

//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方法内部是否当前语言已更改并执行相同操作。
4

1 回答 1

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

于 2013-11-28T19:57:51.720 回答