【问题标题】:MultiSelectListPreference not storing values?MultiSelectListPreference 不存储值?
【发布时间】:2013-08-06 17:55:32
【问题描述】:

我对 Android 应用程序开发相当陌生,所以也许我只是犯了一个简单的新手错误,但这是我的问题: 我有 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>

现在,当我选择该首选项时,它会向我显示包含数组中定义的所有条目的列表,我可以选择多个条目,当我确认对话框时,值实际上存储在已定义键下的 SharedPreferences 中。但是,如果我现在再次显示首选项,它将显示我以前选择的项目,但这些值不再存储在 SharedPreferences 中,经过一番摆弄后,我不得不意识到 SharedPreferences 中的值显然会被擦除显示对话框。

所以现在我的问题是:这是正常/预期的行为还是这是一个错误?我该如何解决这个问题? 我已经尝试过自己实现 MultiSelectListPreference 并像这样覆盖 onPrepareDialogBu​​ilder 方法

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    我昨天花了一些时间在这个上面,现在我确信它不是这样的,而是实际上被破坏了——有人混淆了指针和值的引用。 ;-)

    似乎在最新版本的 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 );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多