56

我需要在 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" />

在活动中,我想做这样的事情:

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

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

4

11 回答 11

109

您不需要以编程方式处理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元素。

于 2013-07-07T04:12:44.377 回答
26

你有没有尝试过:

setValueIndex(int index);
于 2011-03-04T17:50:13.173 回答
11

对不起我的英语不好。

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

代码:

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

if(dataPref.getValue() == null){
    dataPref.setValueIndex(0); //set to index of your deafult value
}
于 2014-02-06T22:20:02.120 回答
4

您可以使用这样的键设置默认值

<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" />
于 2017-08-23T14:52:14.167 回答
3

或者你也可以试试colour.setValue(mycolour);

于 2012-04-10T10:29:07.563 回答
3

仅作记录,如果其他人有此问题:

setValueIndex(int X)正在将值 @index X 设置为默认值 - 所以可能是您正在寻找的

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

于 2013-07-25T14:02:02.667 回答
3
((ListPreference) findPreference("pref_language")).setValue(Locale
                .getDefault().getLanguage());

setValue()是 ListPreference 的方法,并且setDefaultvalue是 Preference 的方法

于 2014-11-18T09:38:41.787 回答
3

实际上这是因为 SharedPreferences 在您重新构建应用程序后会持续存在。卸载它并重试。

于 2016-09-09T05:24:57.017 回答
1

ListPreference这是一篇旧文章,但这是使用以下代码行设置默认值的另一种方法:

PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
于 2017-03-11T00:09:39.027 回答
1

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

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

如果仍然无法正常工作,请尝试以下步骤。

  • 清除应用程序数据。
  • 卸载并重新安装应用程序
  • 检查列表首选项,您将看到选择的默认值

奇怪,我知道,但它在我的情况下有效。

于 2018-11-07T04:51:30.583 回答
0

androidx.preference:preference-ktx:1.1.1如果您使用的是 Android Jetpack Preference,在 Kotlin 中称为,您可以使用:

app:defaultValue="<Value_in_string-array_with_values>".

另外:defaultValue不是索引号,是 values 数组中的实际值。

我还建议使用字符串资源作为默认值并清除数据、卸载应用程序或删除文件:

  • <package_name_in_app_manifest>_preferences.xmldata/data/shared_prefs/<package_name_in_app_manifest>. 替换<package_name_in_app_manifest>为真实姓名,如com.example.yourapp

我遇到了同样的问题并且defaultValue没有更新,因为它已经有一个错误的默认值“true”。通过使用 Android Studio 文件资源管理器并删除文件来解决它。

这是我的解决方案示例:

res/xml/root_preferences.xml

<ListPreference
    
    app:key="mic"
    
    app:title="@string/select_mic_title"
 
    app:useSimpleSummaryProvider="true"
   
    app:entries="@array/mic_entries"

    app:entryValues="@array/mic_values"
    app:defaultValue="@string/default_mic"
    />

res/values/arrays

<!-- Mic Preference -->

<string-array name="mic_entries">

    <item>@string/default_mic</item>

    <item>Headband</item>

</string-array>


<string-array name="mic_values">

    <item>@string/default_mic</item>

    <item>Headband</item>

&lt;/string-array>

res/strings.xml

<string name="default_mic">Integrated</string>

结果: 使用字符串资源@string/default_mic 给出的默认列表值“Integrated”设置片段

于 2022-01-24T17:27:13.453 回答