我对Android App开发很新,所以也许我只是犯了一个简单的新手错误,但这是我的问题: 我有2个简单的活动,MainActivity和SettingsActivity。在MainActivity中,我有一个显示SettingsActivity的按钮。在SettingsActivity中,我包含一个PreferenceFragment SettingsFragment,并在Activity的底部显示一个ButtonBar。在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>
现在,当我选择Preference时,它会显示包含数组中定义的所有条目的列表,我可以选择多个条目,当我确认对话框时,值实际上存储在已定义键下的SharedPreferences中。但是,如果我现在再次显示Preference它会显示我之前选择的项目,但是这些值不再存储在SharedPreferences中,并且在一些摆弄之后我必须意识到SharedPreferences中的值显然会被删除显示对话框。
所以现在我的问题是:这是正常/预期的行为还是这个错误?我该如何解决这个问题? 我已经尝试自己实现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>()));
}
但是此时显然已经消除了这些值。
答案 0 :(得分:7)
我昨天花了一些时间在这上面,现在我确信这不是那样的,但实际上已经破了 - 有人把指针与价值混淆了。 ; - )
似乎要在更新的Android版本(自4.1版)中修复: https://code.google.com/p/android/issues/detail?id=22807
我现在为以前版本的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 );
}