利用PreferenceActivity简化首选项的设计

目前Android手机上的应用,大部分都带有设置功能,即在里面选择一些本应用的自定义设置,便于用户的定制化。
但如果自己写一个Activity来实现,未免过于复杂,而且浪费时间。
Android框架已经为我们提供了一个简单的方式来实现设置页面,即使用PreferenceActivity。
首先,在res/xml下新建一个preference.xml文件,用于定义首选项页面的布局。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="PreferenceCategory 1">
        <CheckBoxPreference
            android:key="CheckBox1"
            android:title="CheckBox"
            android:summaryOn="某功能: 开启"
            android:summaryOff="某功能: 关闭"
            android:defaultValue="true"
        />
    </PreferenceCategory>
    <PreferenceCategory android:title="PreferenceCategory 3">
    <ListPreference
        android:key="ListPreference"
        android:title="ListPreference"
        android:summary="ListPreference测试"
        android:dialogTitle="ListPreference"
        android:entries="@array/entries_list_preference"
        android:entryValues="@array/entriesvalue_list_preference"
    />
    <EditTextPreference
        android:key="EditTextPreference"
        android:title="EditTextPreference"
        android:summary="点击输入"
        android:dialogTitle="输入设置"
    />
    <RingtonePreference
        android:key="RingtonePreference"
        android:title="RingtonePreference"
        android:summary="选择铃声"
    />
    </PreferenceCategory>
</PreferenceScreen>

 
通用属性:
 title:第一张图中的”删除旧信息”、”短信设置”
 key:用于检索该首选项,可以在代码中利用PreferenceManager.getDefaultSharedPreferences(context).getXXX(key,valueNotExist)方法获得该首选项的值。也可以利用PreferenceActivity的getPreference(key)获取该Preference对象,进而设置相应的值。
 defaultValue:默认值,当继承了PreferenceActivity的页面打开时,通常会在onCreate中调用addPreferencesFromResource方法加载首选项。此时,若设置了defaultValue,且之前未设置过该项的值,系统会自动将其设为defaultValue,并写入该应用的首选项文件中。这样,若要实现一键恢复默认值,只要调用addPreferencesFromResource即可。
 summary:第一张图中”达到数量上限时删除旧信息”
 dependency:其余Preference的key(通常为某个CheckBoxPreference的),若设置了该项,当依赖项选中时才可以设置本项。
 persistent:为true时,系统会帮助我们去保存该设置。默认为true。
标签:
PreferenceScreen:设置页面,可嵌套形成二级设置页面,用Title参数设置标题。目前没怎么用过,以后用到再补充。
PreferenceCategory是一个首选项组,通常把一类的设置项用一个PreferenceCategory包起来。如下图中的存储设置所示。


 
CheckBoxPreference就是选择框,只有两种值,true或false,可用Title参数设置标题,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示。
ListPreference:下拉框选择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,效果如下图所示。用dialogTitle设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/values/array.xml(可以是自定义的文件,建议单独建一个来存储字符串数组)中设置两个array来表示,在preference.xml中用android:entries指定显示内容的id,android:entryValues指定相应内容的值的id。如下图所示。

 

<string-array name="entries_list_preference">
    <item>始终</item>
    <item>仅在静音时</item>
    <item>一律不</item>
</string-array>
<string-array name="entriesvalue_list_preference">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>

 
注:当你的应用要支持多语言时,建议将entryValues对应的数组中的值用数字表示,这样就可以很好的避免翻译时不小心把值也给改了,造成不同语言切换时,丢失之前的设置(比如说在中文对应的文件里,用值_始终表示,而在英文文件中却是value_always。这样当从中文切换到英文时,因为之前在preference文件中存的是值_始终,在英文情况下,系统无法找到值_始终对应的显示内容,就会造成打开该ListPreference时没有选项被选中)。


 
RingtonePreference:铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃声选择框的标题。
EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
以上这几种Preference,当你对其中的值修改后,系统都会自动将其存入data\data\你的包名\shared_prefs\ 下的preferences文件中(具体起名规则目前还没搞懂,不过一看就知道是哪个文件)。然后每次PreferenceActivity启动时,都会通过addPreferencesFromResource来加载。如果没有对应的值,则设为默认值。如果没有默认值,则不设置。
当然,很多情况下,以上提供的几种往往不能满足我们的需求,这就需要对首选项进行自定义。可以自己实现一个继承自Preference的类,也可以使用默认的Preference,然后对它的点击进行一些处理,如弹出自定义对话框,转到自定义的Activity等等。

建好了preference.xml,就可以新建一个类,继承PreferenceActivity。
在onCreate中可以加一些自定义Preference的初始化代码,调用addPreferencesFromResource来加载preference.xml文件。
在onPreferenceTreeClick中判断点击的是哪个Preference。并进行一些自定义的操作,如弹出自定义的窗口。最后记得调用super. onPreferenceTreeClick。

public class MyPreferenceActivity extends PreferenceActivity{
    /** Called when the activity is first created. */
	CheckBoxPreference checkbox;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        checkbox=(CheckBoxPreference) findPreference("CheckBox1");
    }

	@Override
	public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
			Preference preference) {
		if(preference==checkbox)
			//做一些自定义的事
			;
		return super.onPreferenceTreeClick(preferenceScreen, preference);
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值