Android MultiSelectListPreference不存储值?

Android MultiSelectListPreference不存储值?,android,Android,我对Android应用程序开发相当陌生,所以可能我只是犯了一个简单的新手错误,但我的问题是: 我有两个简单的活动,Main活动和SettingsActivity。在MainActivity中,我有一个显示SettingsActivity的按钮。在SettingsActivity中,我包括一个PreferenceFragment SettingsFragment,并在活动底部显示一个按钮栏。在SettingsFragment中,我有一个定义如下的MultiSelectListPreference:

我对Android应用程序开发相当陌生,所以可能我只是犯了一个简单的新手错误,但我的问题是: 我有两个简单的活动,Main活动和SettingsActivity。在MainActivity中,我有一个显示SettingsActivity的按钮。在SettingsActivity中,我包括一个PreferenceFragment SettingsFragment,并在活动底部显示一个按钮栏。在SettingsFragment中,我有一个定义如下的MultiSelectListPreference:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory 
        android:title="@string/title_schedule_settings">

        <MultiSelectListPreference
            android:key="@string/key_list_schedule"
            android:title="@string/title_schedule_list"
            android:dialogTitle="@string/title_schedule_list"
            android:entries="@array/list_weekdays"
            android:entryValues="@array/list_weekdays"
            android:defaultValue="@array/empty_list"
            android:persistent="true"/>
    </PreferenceCategory>

</PreferenceScreen>

现在,当我选择该首选项时,它会显示包含数组中定义的所有条目的列表,我可以选择多个条目,当我确认对话框时,值实际上存储在定义键下的SharedReferences中。但是,如果我现在再次显示首选项,它将显示以前选择的项目为已选择,但这些值不再存储在SharedReferences中,在进行了一些修改之后,我不得不意识到,一旦显示对话框,SharedReferences中的值显然就会被删除

所以现在我的问题是:这是正常/预期的行为还是一个bug?我怎样才能解决这个问题? 我已经尝试过自己实现MultiSelectListPreference,并像这样重写onPrepareDialogBuilder方法

@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder)
{
    super.onPrepareDialogBuilder(builder);

    Log.i("mmslp", Arrays.deepToString(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>()).toArray()));
    setValues(PreferenceManager.getDefaultSharedPreferences(getContext()).getStringSet(getKey(), new HashSet<String>()));
}
@覆盖
受保护的无效onPrepareDialogBuilder(AlertDialog.Builder)
{
super.onPrepareDialogBuilder(建造商);
Log.i(“mmslp”,Arrays.deepToString(PreferenceManager.GetDefaultSharedReferences(getContext()).getStringSet(getKey(),new HashSet()).toArray());
setValues(PreferenceManager.GetDefaultSharedReferences(getContext()).getStringSet(getKey(),new HashSet());
}

但此时这些值显然已经被删除了。

我昨天花了一些时间在这个问题上,现在确信它不是故意这样做的,而是实际上被破坏了——有人用指针和值混淆了引用

在Android的最新版本(自4.1版起)中似乎已修复,但:

对于以前版本的Android,我现在解决这个问题的方法是在我的MultiSelectListPreference实现中重写setValues方法,然后将这些值复制到一个新对象中:

@Override
public void setValues( Set<String> values ) {

    //Workaround for https://code.google.com/p/android/issues/detail?id=22807
    final Set<String> newValues = new HashSet<String>();
    newValues.addAll( values );
    super.setValues( newValues );
}
@覆盖
公共无效设置值(设置值){
//解决方法https://code.google.com/p/android/issues/detail?id=22807
最终设置newValues=newhashset();
newValues.addAll(值);
super.setValues(newValues);
}