5

我正在使用具有以下属性的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。我正在为和上的SharedPreferenceChanged事件注册和注销监听器。onPauseonResumePreferenceFragment

代码摘录:

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 停止正确响应后它仍然可以工作。

4

2 回答 2

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

也许它对您的情况也有用

于 2014-04-01T12:16:19.227 回答
1

从 SDK 级别 18 开始,它开始按预期工作。显然,它是(或曾经是)此版本之前的 sdks 中的一个错误。值得注意。

于 2013-12-13T11:27:34.093 回答