У меня следующие предпочтения:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<RingtonePreference
android:showDefault="true"
android:showSilent="true"
android:title="@string/feed_alert_ringtone"
android:ringtoneType="ringtone|notification|alarm|all"
android:key="alertringtone"
android:persistent="false">
</RingtonePreference>
</PreferenceScreen>
Когда пользователь изменяет это предпочтение, я вручную сохраняю Uri в базе данных:
public boolean onPreferenceChange(Preference pref, Object change) {
String ringtone = change.toString();
// save it to a db
...
return true;
}
Моя проблема в том, когда пользователь закрывается, а затем возвращается к PreferenceScreen
, значение по умолчанию для RingtonePreference
всегда равно Silence
. Конечно, мне нужно установить значение вручную.
Пробовал это в моем PreferenceActivity
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings); // the XML above
String database_ringtone = ... // get the string saved above from db
// and according to some parameters passed
// to the intent
Preference ringtone = findPreference("alertringtone");
ringtone.setDefaultValue( database_ringtone );
// also tried:
ringtone.setDefaultValue( Uri.parse(database_ringtone) );
}
К сожалению, предпочтение остается на «Тишина» (что означает пустое). Я думал, что когда Предпочтение
не постоянный
будет использоваться значение по умолчанию.
Я не могу сделать его постоянным
, потому что предпочтение используется для нескольких элементов, и данные, которые я получаю из БД, меняются в соответствии с заказ на некоторые дополнительные данные, переданные намерению.
Тем не менее, я хочу устанавливать не значение по умолчанию, а текущее значение, которое я получаю из базы данных. Думал, что это может быть обходной путь. Так что любой другой способ тоже подойдет.
Двойная проверка: сохранение и извлечение из БД работают, так что проблема не в этом.
Как мне установить значение RingtonePreference
из кода?
Изменить: вот небольшое объяснение того, что я хочу сделать, может быть, есть другой способ.
У меня есть несколько пунктов меню (количество варьируется от пользователя к пользователю), для которых пользователь может выбрать мелодию звонка.Выбор мелодии звонка работает с xml выше, идентификатор записи меню передается с Intent
в PreferenceActivity
. Затем URI рингтона сохраняется в базе данных.
При изменении одной из записей воспроизводится сигнал будильника в соответствии с выбранной пользователем мелодией звонка. Итак, он знает, какой из них изменился. Пока проблем нет.
Проблема в том, что пользователь хочет изменить мелодию звонка для записи, для которой он уже определен. Если пользователь выбрал рингтон Foo раньше, при нажатии на RingtonePreference
, рингтон Foo должен быть уже выбран заранее. Это не серьезная ошибка (скорее глюк), но все же очень раздражает.
Насколько я могу судить, невозможно предварительно выбрать значение по умолчанию RingtonePreference
из кода? Или я делаю это «просто неправильно»?
Правка 2: Хорошо, я думаю, что нет способа сделать это. Очень странно, ядро андроида. Позволяет нам использовать предпочтение
и получать из него значения, но не вводить значения обратно. Должно быть, было очень поторопиться. Я рад, что они позволили нам проверить CheckBoxPreference
из кода ...