Язык обновления Android в режиме предпочтения

В моем приложении Android у меня есть функция предпочтения, которая позволяет пользователю переопределить язык приложения. Для этого я вызываю эту функцию в onResume () каждого действия, а затем сбрасываю содержимое:

public static void checkOverrideSystemLanguage(Context context) { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(context); // Check if system's language setting needs to be overridden boolean overrideSystemLanguage = prefs.getBoolean(context .getString(R.string.pref_key_chkbx_override_system_language), false); if (overrideSystemLanguage) { // Get language selection and possible languages String localeString = prefs.getString( context.getString(R.string.pref_key_list_languages), ""); List<String> possibleLanguages = Arrays.asList(context .getResources().getStringArray( R.array.pref_values_list_languages)); if (possibleLanguages.contains(localeString)) { // Change language setting in configuration Locale locale = new Locale(localeString); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); } // Use default language else { overrideSystemLanguage = false; } } // Use default language if (!overrideSystemLanguage) { context.getResources().updateConfiguration( Resources.getSystem().getConfiguration(), context.getResources().getDisplayMetrics()); } } 

В каждом действии он отлично работает. Однако в активности предпочтений, когда пользователь меняет язык, он не обновляется сразу, потому что метода setContentView () нет. Пользователь должен вернуться к предыдущему действию и снова запустить действие предпочтений, чтобы увидеть изменение языка.

Я попробовал следующее в прослушителе onPreferenceChange ():

  1. Обновление конфигурации, удаление и считывание настроек:

     checkOverrideSystemLanguage(this); // Remove all preferences and add them to update the language getPreferenceScreen().removeAll(); addPreferencesFromResource(R.xml.preferences); 
  2. Обновление конфигурации и вызов onCreate (null)

  3. Завершение и возобновление деятельности

     finish(); startActivity(new Intent(this, PreferencesActivity.class)); 

Спасибо за вашу помощь!

    У меня была аналогичная проблема, я решил таким образом (как вы сказали: завершение и перезапуск активности). Оно работает!

      public class OptionsActivity extends PreferenceActivity implements YesNoDialogPreference.YesNoDialogListener, SharedPreferences.OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Options Setting final SharedPreferences prefs = getSharedPreferences(OptionsUtility.PREFERENCE_NAME, MODE_PRIVATE); String language = prefs.getString(OptionsUtility.PREFERENCE_LANGUAGE, OptionsUtility.DEFAULT_LANGUAGE); //Update locale OptionsUtility.updateLanguage(this, language); prefs.registerOnSharedPreferenceChangeListener(this); getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE); getPreferenceManager().setSharedPreferencesName(OptionsUtility.PREFERENCE_NAME); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); Preference eraseGameButton = getPreferenceManager().findPreference(OptionsUtility.PREFERENCE_ERASE_GAME); if (eraseGameButton != null) { YesNoDialogPreference yesNo = (YesNoDialogPreference)eraseGameButton; yesNo.setListener(this); } Preference configureKeyboardPref = getPreferenceManager().findPreference("keyconfig"); if (configureKeyboardPref != null) { //KeyboardConfigDialogPreference config = (KeyboardConfigDialogPreference)configureKeyboardPref; //config.setPrefs(getSharedPreferences(MemodroidCoreActivity.PREFERENCE_NAME, MODE_PRIVATE)); //config.setContext(this); } } public void onDialogClosed(boolean positiveResult) { if (positiveResult) { DatabaseScoreManager dbsManager = new DatabaseScoreManager(getApplicationContext()); dbsManager.resetHighScores(); Toast.makeText(this, R.string.toast_highScoresReset,Toast.LENGTH_SHORT).show(); } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { restartActivity(); } @Override protected void onStop() { super.onStop(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } private void restartActivity() { Intent intent = getIntent(); finish(); startActivity(intent); } @Override public void onBackPressed() { finish(); } }