ListPreference 取消按钮奇怪的行为

ListPreference cancel button weird behaivour

我在我的 android 应用程序中实现了一个设置屏幕,它有一个 ListPreference 允许用户选择语言。 It works fine when an item of the list is selected, recreating the activity and translating the literals automatically, but when the cancel button is pressed, if the user tries to change the language again, the effect is not visible, but当设置屏幕关闭时,文字已被完美翻译。

那是我的 SettingsActivity 内部 class 建模我正在使用的片段:

public class SettingsActivity extends PreferenceActivity {

    /** Preferences fields */
    private static final String PREF_LANGUAGE = "pref_language";

    /**
     * Method called when the application is been started
     *
     * @param savedInstanceState the saved instance state
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final String PREF_LANGUAGE = "pref_language";

        super.onCreate(savedInstanceState);

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

        String language = "en";
        if (Locale.getDefault().getLanguage().equals("es")) {
            language = "es";
        }
        String languagePref = settings.getString(PREF_LANGUAGE, language);
        Locale locale = new Locale(languagePref);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getResources().updateConfiguration(config, getResources().getDisplayMetrics());
        setContentView(R.layout.settings_activity);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            /**
             * Method triggered when a shared preference changes
             *
             * @param sharedPreferences is the object which represents the shared preferences
             * @param key is the key of the preference changed
             */
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                switch (key) {
                    case PREF_LANGUAGE:
                        Locale locale = new Locale(sharedPreferences.getString(key, ""));
                        Locale.setDefault(locale);
                        Configuration config = new Configuration();
                        config.locale = locale;
                        getResources().updateConfiguration(config, getResources().getDisplayMetrics());
                        recreate();
                        break;
                }
            }
        };

        prefs.registerOnSharedPreferenceChangeListener(prefListener);
    }

    /**
     * Class which represents the fragment for the settings screen
     */
    public static class GeograppPreferenceFragment extends PreferenceFragment {

        /**
         * Method triggered when the fragment is created
         *
         * @param savedInstanceState is the state of the fragment
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(settings);
            SharedPreferences settings = getPreferenceManager().getSharedPreferences();

            String language = "en";
            if (Locale.getDefault().getLanguage().equals("es")) {
                language = "es";
            }
            String languagePref = settings.getString(PREF_LANGUAGE, language);
            getPreferenceManager().findPreference(PREF_LANGUAGE).setDefaultValue(languagePref);
        }
    }
}

偏好xml是:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="@string/settings_display" />

        <ListPreference
            android:key="pref_language"
            android:title="@string/settings_language_title"
            android:summary="@string/settings_language_summary"
            android:entries="@array/language_options"
            android:entryValues="@array/language_values" />

</PreferenceScreen>

很难理解您的问题,但我认为使用 onResume() 函数可以帮助您解决问题。当您离开设置屏幕时,将调用 onResume() 函数,您可以在此处立即更新语言。

最后,我可以通过使用指令 setOnPreferenceChangeListener 为该偏好定义一个单独的侦听器并删除 OnCreate 方法

中的 OnSharedPreferenceChangeListener 来解决这个问题