Язык обновления 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(); } } 
    Intereting Posts
    Android: загрузите файл из Интернета с помощью DownloadManager и сохраните его во внутренней памяти Настройка ListView для прокрутки позиции в Android Установить программный размер Преимущества объявления строки в качестве ресурса в файле strings.xml Значение RealEx Exception «значение» не является допустимым управляемым объектом Android – применить selectableItemBackground в xml с поддержкой v7 Admob interstitial со звуком Как сделать следующий запрос в Firebase? (Более одного, где условие) Gradle – DependencySubstitution для Android-приложения с библиотекой Правильное использование фонового сервиса / широковещательного приемника Установка заголовка и заголовка Action Bar Разница между сценой и экраном libgdx Имеет ли смысл иметь более одного сокета UDP Datagram в режиме ожидания? Являются ли «одновременные» пакеты сброшены или поставлены в очередь ядром? Значки настроек Android Android – выберите кнопку «Файл» в WebView