我有以下的偏好:
<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
,因为偏好用于多个项目,并且从DB获取的数据根据传递给意图的一些额外数据而变化。
尽管如此,我不想设置默认值,而是要设置从数据库中获取的当前值。我认为这可能是一个解决方法。所以任何其他方式也可以。
已经双重检查了保存和从DB检索是否正常工作,所以那不是问题。
我如何从代码中设置RingtonePreference
值?
编辑:这里有一个小解释,我想做什么,也许还有另一种方法。
我有几个菜单项(数量因用户而异),用户可以为每个菜单项选择铃声。选择铃声使用上面的xml完成,菜单项的ID通过Intent
传递到PreferenceActivity
中。铃声的URI然后存储在数据库中。
当其中一个条目更改时,会根据用户所做的铃声选择播放警报。因此,他知道哪一个更改了。到目前为止没有问题。
问题在于,当用户想要为已经定义了铃声的条目更改铃声时。如果用户之前选择的铃声是Foo,则在单击RingtonePreference
时,应预先选择铃声Foo。这不是什么严重的错误(更像是一个故障),但仍然非常令人恼火。
据我所知,没有办法从代码中预选默认的RingtonePreference
吗?还是我做错了?
编辑2:好的,我认为没有办法做到这一点。非常奇怪,Android核心,允许我们使用Preference
并从中获取值,但不能将值放回。肯定很匆忙。我很高兴可以用代码检查CheckBoxPreference
...