Android首选项(一) RingtonePreference详解

很久没有发博客了,这次试用android的Preference遇到了一些问题,虽然解决方案最后都很轻松,但是过分依赖于找资料的过程可不是很轻松。好了废话不多说,中文搜索出来的首选项都是最最基础的解释和demo,这吧遇到的问题说一说,下面先来说RingstonePreference的问题:

 

 

试用RingstonePreference相比于其他的Preference提供的方法感觉略显单薄,尤其setValue、getValue没有提供,就在下一次进入初始化(因为默认试用上一次的,所以试用首选项时记得activity初次加载的时候数据还原)和获取值的时候遇到问题。

 

今天set的方法在这里搜到了最接近的答案:

http://stackoverflow.com/questions/6061598/how-to-set-ringtonepreference-value-from-code

其实这个里面的问题只是没有commit

 

Editor edit=ringPreference.getSharedPreferences().edit();
edit.putString(ringPreference.getKey(), alarm.getRingSource());
edit.commit();

 

set的方法就是这样的,

 

下面先附上get的方法,这个比较简单

 

ringPreference.getSharedPreferences().getString(ringPreference.getKey(), "");

 

开始纠结于找不到set方法,最后无奈了去看源码,然后所有问题都迎刃而解了,不过在你并不对这些数据能非常简单的控制的时候最好使用上面两种方法,然后其他情况就用到这里了,这里有几个protected方法

 

protected void onSaveRingtone(Uri ringtoneUri) {
        persistString(ringtoneUri != null ? ringtoneUri.toString() : "");
}

 

再看父类Preference中的两个

 

protected boolean persistString(String value) {
        if (shouldPersist()) {
            // Shouldn't store null
            if (value == getPersistedString(null)) {
                // It's already there, so the same as persisting
                return true;
            }
            
            SharedPreferences.Editor editor = mPreferenceManager.getEditor();
            editor.putString(mKey, value);
            tryCommit(editor);
           return true;
        }
        return false;
 }

protected String getPersistedString(String defaultReturnValue) {
        if (!shouldPersist()) {
            return defaultReturnValue;
        }
        
        return mPreferenceManager.getSharedPreferences().getString(mKey, defaultReturnValue);
}



 

这里应该很清晰了,当然,api提供了能获取到值的路径,但也为我们重新构造最适合特定项目中使用的机制,只需要简单的在public方法中super一下就成功了,其他还有很多方法可以构造更有用途的方法,这里就个常用的例子。

 

因此你可以很方便的构造自己的Preference(在开发过程中其实会用到很多自己重写的Preference,因为有些情况方法没有提供,也有可能会有需要对getValue解析等等很多情况。父类中几乎大多都是protected方法,给重写带来很多方便),Preference为开发提供了很多遍历,这里跟大家分享了

 

附上父类源码地址:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/preference/RingtonePreference.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DialogPreferenceAndroid中的一个Preference,它可以弹出一个对话框,让用户输入或选择一些设置参数。以下是一个简单的DialogPreference示例。 首先,在你的res/xml文件夹下创建一个preference.xml文件,添加如下代码: ```xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Dialog Preferences"> <EditTextPreference android:key="edit_text_preference" android:title="Edit Text Preference" android:summary="Enter some text" android:dialogTitle="Enter Text" android:positiveButtonText="OK" android:negativeButtonText="Cancel" /> <ListPreference android:key="list_preference" android:title="List Preference" android:summary="Choose an item" android:dialogTitle="Choose Item" android:entries="@array/list_entries" android:entryValues="@array/list_entry_values" android:defaultValue="1" /> <RingtonePreference android:key="ringtone_preference" android:title="Ringtone Preference" android:summary="Choose a ringtone" android:dialogTitle="Choose Ringtone" /> <CheckBoxPreference android:key="checkbox_preference" android:title="Checkbox Preference" android:summary="Check or uncheck" android:defaultValue="false" /> </PreferenceCategory> </PreferenceScreen> ``` 上述代码定义了四个不同的DialogPreference,分别是EditTextPreference、ListPreferenceRingtonePreference和CheckBoxPreference。 接下来,创建一个SettingsFragment类,继承自PreferenceFragmentCompat,然后在onCreatePreferences方法中加载preference.xml文件: ```java public class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preference, rootKey); } } ``` 最后,在你的Activity中使用SettingsFragment替换掉原来的布局文件: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new SettingsFragment()) .commit(); } } ``` 其中,R.id.settings_container是你原来布局文件中用来放置设置项的容器。现在,运行应用程序,点击设置菜单,就可以看到上面定义的四个DialogPreference了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值