Android MultiSelectListPreference取消选中不会触发SharedPreferenceChanged

Ork*_*zen 5 events android listener android-multiselectlistpreference

我正在使用具有以下属性的MultiSelectListPreference

<MultiSelectListPreference        
 android:key="shop_list"               
 android:entries="@array/shop_titles"
 android:entryValues="@array/shop_values"
     android:title="@string/pref_title_shops"   
     android:dialogTitle="@string/pref_title_shops" 
 android:defaultValue="@array/shop_values"
 android:summary="Choose where you hunt"
 />   
Run Code Online (Sandbox Code Playgroud)

偏好在静态PreferenceFragment内部,在普通内部Activity。我SharedPreferenceChanged正在为onPauseonResume上的事件注册和取消注册侦听器PreferenceFragment

代码摘录:

public class AgentSettingsActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }

    public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Utils.Log("onCreate");

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.pref_general);

        }

        @Override
        public void onResume()
        {
            Utils.Log("onResume");
                    super.onResume();
            try
            {
                Utils.Log("Add pref listeners and try set summary");
               getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

            }
            catch (Exception e)
            {
                Utils.Log("Pref not found");
            }

        }

        @Override
        public void onPause()
        {
            super.onPause();
            Utils.Log("onPause");

            // Unregister the listener whenever a key changes
            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);

        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
        {
            Utils.Log("onPreferenceChange, key : " + key);    
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

当我选中一个选项时,该事件每次都会触发,直到我开始取消选中它们为止。然后侦听器停止被调用。有什么想法我想念的吗?这对我使用Fragment / Activity的方式有影响吗?

注意:我还应该补充一点,我有一个ListPreference,即使MultiSelectListPref停止正确响应后,它仍然可以继续工作。

Cal*_*oni 2

我正在处理同样的问题。从 SDK 18 开始,一切似乎都工作正常,但在休息时,我遇到了和你一样的问题。

我找到了一个似乎对我有用的解决方案:

    MultiSelectListPreference multiSelectListPref = (MultiSelectListPreference) findPreference("pref_name");
    if (multiSelectListPref != null) {
        multiSelectListPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                MultiSelectListPreference mpreference = (MultiSelectListPreference) preference;
                mpreference.setSummary(newValue.toString());
                mpreference.setValues((Set<String>) newValue);
                return true;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

也许它对你的情况也有用