Как установить значение по умолчанию для ListPreference

мне нужно установить значение по умолчанию для ListPreference при запуске Activity. Я пробовал с 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>

В XML-файле PreferenceScreen:

<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);

Но это не работает, потому что он делает первый выбор по умолчанию. Не могли бы вы объяснить мне, как сделать еще один по умолчанию? Спасибо.


person Gnufabio    schedule 04.03.2011    source источник


Ответы (10)


Ты пытался:

setValueIndex(int index);
person biddulph.r    schedule 04.03.2011
comment
Я не уверен, что это правильное решение, поскольку setValue или setValueIndex будут эффективно устанавливать значение, даже если пользователь уже предоставил пользовательское значение, которое хранится в настройках. Что работает для меня, так это if (colour.getValue() == null) { colour.setValue(mycolour); } - person mtotschnig; 10.04.2012
comment
а что такое int index? Что, если я хочу установить определенную строку? - person Ali Bdeir; 02.11.2016
comment
Как получить последнее значение, хранящееся в постоянном хранилище, для предпочтения, для которого было установлено постоянное хранилище? - person Akay; 26.11.2017

Вам не нужно программно обрабатывать значение по умолчанию 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.

person Md. Naushad Alam    schedule 07.07.2013
comment
Что, если opts_values ​​— это целочисленный массив? Или это плохая идея? - person Keith; 24.12.2015
comment
Обратите внимание, что в XML первая опция начинается с индекса 1 (т. е. android:defaultValue="1") вместо 0. - person Kenny Worden; 31.07.2017
comment
@Keith, если вы используете что-либо, кроме string-array, вы получите сообщение об ошибке при попытке найти соответствующий элемент. см. stackoverflow.com/a/25355756/2550406 - person lucidbrot; 10.10.2017
comment
Мой xml-файл по какой-то причине имеет префикс app: для всего... Все работает, кроме атрибута app:defaultValue - person Elijah Mock; 08.01.2020
comment
Если ваш корневой элемент androidx.preference.PreferenceScreen (или эквивалент библиотеки поддержки), вам понадобится префикс app: - person Matt Robertson; 06.05.2020

Извините за мой плохой английский.

  1. Пункт списка
  2. Получить список Проверить, является ли значение нулевым. Если он равен нулю, установите значение по умолчанию.

Код:

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

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

Вы можете установить значение по умолчанию, используя ключ, подобный этому

<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" />
person pavel    schedule 23.08.2017

или вы также можете попробовать colour.setValue(mycolour);

person ungalcrys    schedule 10.04.2012

Просто для протокола, если у кого-то еще возникла эта проблема:

setValueIndex(int X) устанавливает для значения @ index X значение по умолчанию, поэтому это вероятно то, что вы ищете.

Установите это значение ПОСЛЕ добавления значений! (глупая ошибка, но у меня ушло полчаса)

person Langusten Gustel    schedule 25.07.2013

На самом деле это потому, что SharedPreferences будут сохраняться после повторной сборки приложения. Удалите его и повторите попытку.

person Yijun Li    schedule 09.09.2016

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

setValue() — это метод ListPreference, а setDefaultvalue — это метод Preference.

person laomo    schedule 18.11.2014

Это старый пост, но вот еще один способ установить значение по умолчанию для ListPreference с помощью следующей строки кода:

PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
person wooldridgetm    schedule 11.03.2017

Используйте атрибут xml android:defaultValue="<VALUE>" в теге списка, чтобы установить значение по умолчанию.

Примечание: <VALUE> — это фактическое значение, а не индекс массива строк.

Если он по-прежнему не работает, попробуйте выполнить следующие шаги.

  • Очистить данные приложения.
  • Удалите и переустановите приложение
  • Проверьте настройки списка, вы увидите выбранное значение по умолчанию.

Странно, я знаю, но это сработало в моем случае.

person Vivek    schedule 07.11.2018