У меня есть следующие предпочтения:
<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) );
}
К сожалению, предпочтение остается на «Безмолвии» (что означает «пустой»). Я думал, что когда Preference
не persistent
, будет использоваться значение по умолчанию.
Я не могу сделать это persistent
, потому что предпочтение используется для нескольких элементов, и данные, которые я получаю из БД, изменяются в соответствии с некоторыми дополнительными данными, передаваемыми в намерение.
Тем не менее, я не хочу устанавливать значение по умолчанию, но текущее значение, которое я получаю из базы данных. Думаю, это может быть обходной путь. Так что любой другой способ тоже был бы хорош.
Двойная проверка сохранения и извлечения из БД работает, так что это не проблема.
Как я могу установить значение RingtonePreference
из кода?
Редактировать: Вот небольшое объяснение того, что я хочу сделать, может быть, есть другой способ.
У меня есть несколько пунктов меню (количество зависит от пользователя), для которого пользователь может выбрать мелодию звонка. Выбор мелодии звонка работает с xml выше, идентификатор пункта меню передается с Intent
на PreferenceActivity
. URI рингтона затем сохраняется в базе данных.
Когда одна из записей изменяется, сигнал тревоги воспроизводится в соответствии с выбором мелодии звонка, сделанным пользователем. Так что он знает, какой из них изменился. Пока проблем нет.
Проблема в том, что когда пользователь хочет изменить мелодию звонка для записи, для которой он уже определен. Если пользователь выбрал рингтон Foo ранее, то при нажатии на RingtonePreference
рингтон Foo уже должен быть предварительно выбран. Это не серьезная ошибка (больше похоже на глюк), но все же очень раздражает.
Насколько я могу судить, нет способа предварительно выбрать по умолчанию RingtonePreference
из кода? Или я делаю это "просто неправильно"?
Редактировать 2: Окей, я думаю, что нет способа сделать это. Очень странно, ядро андроида. Позволяет нам использовать Preference
и получать значения из него, но не возвращать значения обратно. Должно быть, это была настоящая спешка. Я рад, что они позволили нам проверить CheckBoxPreference
из кода ...