我有以下偏好:
<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
是 always 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,菜单项的 IDIntent
与PreferenceActivity
. 然后将铃声的 URI 存储在数据库中。
当其中一个条目发生变化时,将根据用户所做的铃声选择播放警报。所以他知道是哪一个变了。到目前为止没有问题。
问题是,当用户想要更改他已经定义的条目的铃声时。如果用户之前选择了铃声 Foo,当点击 时RingtonePreference
,应该已经预先选择了铃声 Foo。这不是严重的错误(更像是一个小故障),但仍然很烦人。
据我所知,没有办法RingtonePreference
从代码中预先选择默认值?还是我这样做“只是错误的”?
编辑2:好吧,我认为没有办法做到这一点。很奇怪,安卓内核。允许我们使用 aPreference
并从中获取值,但不能将值放回原处。一定很着急。我很高兴他们允许我们检查CheckBoxPreference
代码...