Mar*_*kus 6 android preferenceactivity android-preferences
我有以下偏好:
<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>
Run Code Online (Sandbox Code Playgroud)
当用户更改此首选项时,我手动将Uri保存到数据库:
public boolean onPreferenceChange(Preference pref, Object change) {
String ringtone = change.toString();
// save it to a db
...
return true;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当用户关闭然后返回时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) );
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,偏好保持在"沉默"(这意味着空洞).我想,当Preference
不是persistent
默认值时将使用.
我无法做到persistent
,因为首选项用于多个项目,而我从DB获取的数据会根据传递给intent的一些额外数据而更改.
不过,我不想设置默认值,而是我从数据库中获取的当前值.认为这可能是一种解决方法.所以任何其他方式也都会很好.
双重检查保存和从DB检索工作正常,所以这不是问题.
如何RingtonePreference
从代码中设置值?
编辑:这里有一点解释我想做什么,也许还有另一种方式.
我有几个菜单条目(计数因用户而异),用户可以为其选择铃声.选择铃声适用于上面的xml,菜单条目的ID与a Intent
一起传递给PreferenceActivity
.然后将铃声的URI存储在数据库中.
当其中一个条目改变时,根据用户做出的铃声选择播放警报.所以他知道哪一个改变了.到目前为止没问题.
问题是,当用户想要为他已经为其定义的条目更改铃声时.如果用户在点击之前选择了铃声Foo RingtonePreference
,则应该预先选择铃声Foo.这不是严重错误(更像是故障),但仍然非常烦人.
据我所知,没有办法预先RingtonePreference
从代码中选择默认值?或者我这样做"只是错了"?
编辑2:Okey,我认为没有办法做到这一点.非常奇怪,android核心.允许我们使用a Preference
并从中获取值,但不能重新输入值.一定是真的很快.我很高兴他们允许我们CheckBoxPreference
从代码中查看...
我正在搜索如何设置铃声的默认值,并实现与您相同的事情,即当未设置首选项时,值为空并且默认选择静默.但我这样做
// I read my ringtone setting (I read the value from my ringtone_uri key)
// then if it is not set I set the value with the default value from the phone
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
Uri configuredUri = Uri.parse(sharedPrefs.getString("ringtone_uri", Settings.System.DEFAULT_RINGTONE_URI.toString()));
// then I do this, I save the default ringtone to my settins
if(configuredUri.equals(Settings.System.DEFAULT_RINGTONE_URI)){
sharedPrefs.edit()
.putString("ringtone_uri", Settings.System.DEFAULT_RINGTONE_URI.toString())
.commit();
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否会对你有所帮助,但我希望它会对别人有所帮助.顺便说一下,我发现了这个解决方法
小智 -1
看起来您在将铃声插入数据库时没有包含声音文件的路径,因此每当您尝试从应用程序设置时它都会进入“静音”状态。当您说必须手动设置该值时,看起来声音文件是通过媒体/铃声的媒体扫描拾取的,并在此时插入数据库中。下面的代码需要根据您的操作方式进行修改,但希望它能给您带来正确的想法。
尝试类似的方法:
File k = new File(path2, filename);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
//kill database for this object before inserting
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
Uri newUri = getContentResolver().insert(uri, values);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6679 次 |
最近记录: |