0

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

这是我的preferences.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);
        }        
    }
}
4

2 回答 2

0

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

于 2013-09-29T17:30:55.963 回答
0

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

这是 sharedpreferences 类

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();

这就是我建造它的方式......就像一个魅力......而且一点也不复杂

于 2013-09-29T17:25:17.737 回答