Язык обновления 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));
    

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


person Oliver    schedule 17.10.2011    source источник
comment
Вы можете использовать небольшой хак и вызвать getActionBar().setTitle(ваш заголовок) в каком-то методе, который вы вызываете в начале   -  person Martin Ch    schedule 19.03.2014


Ответы (1)


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

    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();
    }
}
person Cisco    schedule 16.02.2013