如何设置ListPreference的默认值

62

当Activity启动时,我需要设置ListPreference的默认值。我尝试使用ListPreference.setDefaultvalue("value");,但这会将列表的第一个条目设置为默认值。我需要这样做是因为我必须检查条件并将满足该条件的值设置为默认值,因此我认为不能从xml文件中完成(使用android:defaultValue)。

例如,假设我在arrays.xml中有以下值的数组:

<string-array name="opts">
    <item>red</item>
    <item>green</item>
    <item>blue</item>
</string-array>

<string-array name="opts_values">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>
在PreferenceScreen的xml中:
<ListPreference
    android:title="Colour select"
    android:summary="Select your favourite"
    android:key="colour"
    android:entries="@array/opts"
    android:entryValues="@array/opts_values" />

在Activity中,我想要做这样的事情:

String mycolour;
if (something) {
    mycolour="1";
} else {
    mycolour="2";
}
ListPreference colour = (ListPreference) findPreference ("colour");
colour.setDefaultValue(mycolour);

但它不起作用,因为它使第一个选择默认。你能解释一下如何将另一个选项设为默认吗?谢谢。

11个回答

114

您不需要以编程方式处理ListPreferences的默认值,您可以在XML设置文件中完成此操作。以下是一个示例:

<string-array name="opts">
    <item>red</item>
    <item>green</item>
    <item>blue</item>
</string-array>

<string-array name="opts_values">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>

...

<ListPreference
    android:title="Colour select"
    android:summary="Select your favourite"
    android:key="colour"
    android:entries="@array/opts"
    android:entryValues="@array/opts_values"
    android:defaultValue="2" />

这里我选择了2作为默认值。记住defaultvalue将是opts_values元素。


3
如果 opts_values 是一个整数数组,会怎么样?或者说这个想法不好吗? - ki9
3
请注意,在 XML 中,第一个选项从索引 1 开始(即 android:defaultValue="1"),而不是从 0 开始。 - Kenny Worden
1
@Keith 如果你使用除了string-array以外的任何内容,当它试图查找相应的项目时,您将会得到一个错误提示。请见 https://dev59.com/GnXYa4cB1Zd3GeqP_OCc#25355756。 - lucidbrot
1
我的 XML 文件中每个东西都有一个“app:”前缀,原因不明... 除了“app:defaultValue”属性之外,一切正常。 - Elijah Mock
如果您的根元素是androidx.preference.PreferenceScreen(或支持库等效项),那么您需要使用“app:”前缀。 - Matt Robertson

28

你尝试过吗:

setValueIndex(int index);

47
我不确定这是否是正确的解决方案,因为setValue或setValueIndex会有效地设置值,即使用户已经提供了存储在首选项中的自定义值。对我有用的是:如果(color.getValue() == null){ color.setValue(myColor); } - mtotschnig
int index 是什么?如果我想设置一个定义好的字符串,该怎么办? - Ali Bdeir
如何检索已设置为持久存储的首选项的最后一个存储值? - Akay
@AliBdeir 索引是应该使用的值列表内部的索引。但正如已经注意到的那样,这并不是解决方案本身。这不应该是被接受的答案。 - Marcell

13

对不起,我的英语不好。

  1. 列表项
  2. 检索列表,检查值是否为空。如果为空,则设置为默认值。

代码:

ListPreference dataPref = (ListPreference) findPreference("keyList");

if(dataPref.getValue() == null){
    dataPref.setValueIndex(0); //set to index of your deafult value
}

5
您可以通过以下方式使用键来设置默认值:
<string-array name="syncFrequency">
    <item name="1">Block All Calls</item>
    <item name="2">Block Black List</item>
    <item name="3">Block Unknown Calls</item>
    <item name="4">Allow White List</item>
    <item name="5">Receive All Calls</item>
</string-array>




<string-array name="syncFrequencyValues">
    <item name="1">Block_All_Calls</item>
    <item name="2">Block_Black_List</item>
    <item name="3">Block_Unknown_Calls</item>
    <item name="4">Allow_White_List</item>
    <item name="5">Receive_All_Calls</item>
</string-array>



     <ListPreference
        android:key="prefSyncFrequency"
        android:entries="@array/syncFrequency"
        android:summary="%s"
        android:defaultValue="Block_Black_List"
        android:entryValues="@array/syncFrequencyValues"
        android:title="@string/call_block_options" />

3
((ListPreference) findPreference("pref_language")).setValue(Locale
                .getDefault().getLanguage());

setValue() 是 ListPreference 的方法,而 setDefaultvalue 是 Preference 的方法。


3

仅供记录,如果有人遇到这个问题:

setValueIndex(int X)将索引为X的值设置为默认值 - 所以这可能是你要找的

在添加值之后设置此值!(愚蠢的错误,但让我花了半小时)


3

实际上这是因为SharedPreferences会在重新构建应用后持久存在。请卸载应用并重试。


3

or you can also try colour.setValue(mycolour);


2
使用xml属性android:defaultValue="<VALUE>"在列表标签中设置默认值。

注意:<VALUE>是实际值而不是字符串数组的索引。

如果仍然无法正常工作,请尝试以下步骤:
  • 清除应用程序数据。
  • 卸载并重新安装应用程序
  • 检查列表首选项,您将看到默认值已被选择
奇怪,我知道,但这在我的情况下起作用了。

2

这是一篇旧文章,但是以下代码提供了另一种方法来设置 ListPreference 的默认值:

PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接