【问题标题】:MultiSelectListPreference defaultValues not workingMultiSelectListPreference defaultValues 不起作用
【发布时间】:2016-04-21 01:45:18
【问题描述】:

我有一个正在 Android Studio 中构建的项目。我添加了预建的首选项屏幕,其中包含可编译和运行良好的片段。我将 MultiSelectListPreference 添加到显示良好并存储首选项设置的首选项屏幕之一。但是,无论我是通过 Java 还是 XML 添加它,defaultValue 都不起作用。我已经阅读了有关如何执行此操作的其他问题的分数。我知道该怎样。我的问题是什么可能导致它无法按预期工作?

pref_general.xml

<MultiSelectListPreference
    android:key="@string/pref_key_starting_addresses"
    android:summary="@string/pref_description_addresses"
    android:title="@string/pref_title_addresses"
    android:entries="@array/empty_array"
    android:entryValues="@array/empty_array" />

PreferenceActivity.java

/**
 * This method autopopulates a MultiSelectListPreference with array values
 * loaded from XML.
 */
private void populateMultiSelectListPreference() {
    List<TypedArray> origins = ResourceHelper.getMultiTypedArray(mContext, "origins");
    CharSequence[] entries = new CharSequence[origins.size()];
    CharSequence[] values = new CharSequence[origins.size()];
    int counter = 0;
    for (TypedArray item : origins) {
        entries[counter] = item.getString(0);
        values[counter] = String.valueOf(counter);
        counter++;
    }

    final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses));
    lp.setEntries(entries);
    lp.setDefaultValue(values);
    lp.setEntryValues(values);
}

数组.xml

<string-array name="empty_array" />

<!-- a number of these are used to generate the MultiSelectListPreference
     titles and entry values-->
<array name="origins_0">
    <item>Text used for title</item>
    <item>data 1</item>
    <item>data 2</item>
</array>

我知道一切工作正常,因为调试显示values 包含有效的 Set 并且保存首选项工作正常。这意味着lp.setEntryValues(values) 可以工作并且values 是一个格式正确的集合。但是,lp.setDefaultValue(values) 无效。复选框在第一次运行时都未选中。我的目标是默认选中它们。

是的,我在测试之间使用了 Android Studio 运行菜单中的 Clean and rerun 'app' 命令。此外,我已经在设备上手动清除了应用缓存。

[编辑]

根据cmets中的建议,我也尝试了以下修改。

private void populateMultiSelectListPreference() {
    List<TypedArray> origins = ResourceHelper.getMultiTypedArray(mContext, "origins");
    CharSequence[] entries = new CharSequence[origins.size()];
    CharSequence[] values = new CharSequence[origins.size()];
    Set<String> defaults = new HashSet<>();
    int counter = 0;
    for (TypedArray item : origins) {
        entries[counter] = item.getString(0);
        values[counter] = String.valueOf(counter);
        defaults.add(String.valueOf(counter));
        counter++;
    }

    final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses));
    lp.setEntries(entries);
    lp.setEntryValues(values);
    lp.setDefaultValue(defaults);
}

【问题讨论】:

  • 你在哪里打电话给populateMultiSelectListPreference
  • 没有理由不能直接在 XML 中工作,你能发布你对 XML 和相关数组的尝试吗?
  • 不要让数组为空。尝试将项目添加到 arrays.xml 中的字符串数组。
  • @pskink 从 PreferenceFragment 的 onCreate 方法中调用。
  • @WannaBeGeek 空数组与 defaultValue 无关。它只是标题和值数组的占位符,在动态添加它们时是必需的。如果不分配 android:entriesandroid:entryValues 属性,则无法在 XML 中拥有 MultiSelectPreference。

标签: java android sharedpreferences multiselectlistpreference


【解决方案1】:

在这里快速猜测,但我想知道原因是否只是您调用值的顺序,考虑到应首先初始化完整列表,我将在最后一步设置默认值:

final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses));
lp.setEntries(entries);
lp.setEntryValues(values);
lp.setDefaultValue(values);

【讨论】:

  • 方法的顺序似乎没有任何影响。我还尝试了使用 Set 而不是 CharSequence[] 的另一条评论中的建议。即使最后一次调用setDefaultValue,也没有一个工作。有趣的是,Android 文档说 setDefaultValue 接受一个 Object 作为参数。进一步调查表明它是从 Preference 类继承的。我想知道 MSLP 是否应该使用自定义实现来覆盖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2014-02-04
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多