繁体   English   中英

ListPreference取消按钮奇怪的行为

[英]ListPreference cancel button weird behaivour

我已经在Android应用中实现了“设置”屏幕,并具有ListPreference以允许用户选择语言。 当选择列表中的一个项目,重新创建活动并自动翻译文字时,它可以正常工作,但是当按下取消按钮时,如果用户再次尝试更改语言,则效果不可见,但是在设置屏幕上已关闭,字面量已完美翻译。

那是我使用内部类建模tha Fragment的SettingsActivity

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指令setOnPreferenceChangeListener首选项定义一个单独的侦听setOnPreferenceChangeListener并在OnCreate方法中删除OnSharedPreferenceChangeListener来解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM