Android MultiSelectListPreference 取消选中不会触发 SharedPreferenceChanged

标签 android events 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"
 />   

首选项位于静态 PreferenceFragment 中,位于普通 Activity 中。我正在为 PreferenceFragmentonPauseonResume 上的 SharedPreferenceChanged 事件注册和注销监听器。

代码摘录:

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

}

当我选中一个选项时,事件每次都会触发直到我开始取消选中它们。然后监听器停止被调用。我在这里缺少什么想法?这与我使用 Fragment/Activity 的方式有关系吗?

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

最佳答案

我正在处理同样的问题。 从 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;
            }
        });
    }

也许它对你的案例也有用

关于Android MultiSelectListPreference 取消选中不会触发 SharedPreferenceChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077568/

相关文章:

php - 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

flash - 如何从由 URLLoader 触发的 Event.COMPLETE 中获取关联的 URLRequest

javascript - Node.js 事件监听器被阻止?

java - 如何使可扩展列表的子项可点击并执行某些操作?

java - 如何连接两个 fragment 并在适配器中编写监听器

events - 如何为 AngularJS 创建 on-change 指令?

android - 无法访问 POJO 类中的 getter

android - 如果使用整数,如何删除结果中的 .0 或 E 或停止崩溃

android - 由于使用 Titanium 的 Facebook 模块出现无效访问 token 错误,无法登录 Facebook

android - Retrofit-http 405 响应?