每次更改首选项时都不会调用onSharedPreferenceChanged

时间:2013-09-29 17:05:51

标签: java android sharedpreferences

我遇到onSharedPreferenceChanged的问题仅在MultiSelectListPreference发生更改时才第一次调用。我打开我的设置活动并更改工作正常的值,并调用onSharedPreferenceChanged。如果我再次打开对话框,则会显示所选的正确条目。我选择另一个条目并点击OK。现在应该调用onSharedPreferenceChanged但不是。如果我现在再次打开对话框,则不会选择任何条目。我错过了什么或者我做错了吗?

这是我的偏好.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <MultiSelectListPreference
        android:key="operations"
        android:title="@string/pref_operations"
        android:dialogTitle="@string/pref_operations"
        android:entries="@array/pref_operations_entries"
        android:entryValues="@array/pref_operations_values"
        android:defaultValue="@array/pref_operations_default" />
</PreferenceScreen>

我的设置片段

public class SettingsFragment extends PreferenceFragment 
          implements SharedPreferences.OnSharedPreferenceChangeListener
{    
    public static final String KEY_OPERATIONS_PREFERENCE = "operations";

    private MultiSelectListPreference operationsPreference;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        operationsPreference = (MultiSelectListPreference) getPreferenceScreen().findPreference(KEY_OPERATIONS_PREFERENCE);        
    }

    @Override
    public void onResume()
    {
        super.onResume();

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

        Set<String> operations = operationsPreference.getValues();
        String summary = "";
        for (String s : operations)
            summary += s + " ";
        operationsPreference.setSummary(summary);

       sharedPreferences.registerOnSharedPreferenceChangeListener(this);
   }

   @Override
   public void onPause()
   {
       super.onPause();

       getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
   }

   @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
        if (key.equals(KEY_OPERATIONS_PREFERENCE))
        {            
            Set<String> operations = operationsPreference.getValues();
            String summary = "";
            for (String s : operations)
                summary += s + " ";
            operationsPreference.setSummary(summary);
        }        
    }
}

2 个答案:

答案 0 :(得分:0)

嗯,坦率地说,我以不同的方式构建了我的sharedPreferances ...附上我的代码示例,希望它对你有用 在这里:

这是共享偏好类

public class AppPreferences {
        public static final String KEY_LANG = "language";
        final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name
                                                                                // of
                                                                                // the
                                                                                // file
                                                                                // -.xml
        private SharedPreferences _sharedPrefs;
        private Editor _prefsEditor;

        public AppPreferences(Context context) {
            this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS,
                    Activity.MODE_PRIVATE);
            this._prefsEditor = _sharedPrefs.edit();
        }

        public String getlanguage() {
            return _sharedPrefs.getString(KEY_LANG, "");
        }

        public void savelanguage(String text) {
            _prefsEditor.putString(KEY_LANG, text);
            _prefsEditor.commit();
        }
    }

使用它你需要创建 在你的班级

private AppPreferences _appPrefs;

以及使用的示例是

    _appPrefs = new AppPreferences(getApplicationContext());
            _appPrefs.savelanguage("English");
language = _appPrefs.getlanguage();

这就是我建造它的方式......就像一个魅力......并且根本不复杂

答案 1 :(得分:0)

这是因为您在onPause回调方法中取消注册侦听器,该方法在Activity中显示Dialog时调用。