详解Android首选项框架的使用实例
首选项这个名词对于熟悉android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。
android提供了一种健壮并且灵活的框架来处理首选项。它提供了简单的api来隐藏首选项的读取和持久化,并且提供了一个优雅的首选项界面。
首先,我们来看下面这款软件的首选项界面:
这款软件使用了好几种类型的首选项,每一种首选项都有其独特的用法,下面我们来了解一下几种常见的首选项:
- checkboxpreference:用来打开或关闭某个功能
- listpreference:用来从多个选项中选择一个值;
- edittextpreference:用来配置一段文字信息;
- preference:用来执行相关的自定义操作(上图中的清除缓存、历史记录、表单、cookie都属于此项);
- ringtonepreference:专门用来为用户设置铃声。
当我们使用首选项框架时,用户每更改一项的值后,系统就会立即在/data/data/[package_name]/shared_prefs下生成一个[package_name]_preferences.xml的文件,文件会记录最新的配置信息。
那么如何使用首选想框架呢?我们需要以下几步操作:
1.建立一个首选项的xml配置文件,放在项目的/res/xml目录下面;
2.新建一个activity,继承android.preference.preferenceactivity,然后在oncreate方法中加载我们的首选项配置文件。
下面,我就为大家演示一下首选项框架的配置和使用:
我们新建一个prefs项目,项目结构如下:
我们要实现的功能跟上面那款软件的很相似,下面我来说明一下这个项目的整体流程:
1.主界面。显示用户昵称,有三个参数,昵称文字、字体大小和背景颜色。首次进入时,使用默认值。
2.按下menu键中的settings项,跳转到首选项页面,进行参数选择。
3.按下返回键,返回主界面,设定后的参数生效。
首先,让我们来看一下主界面的配置文件,非常简单,就一个textview:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <textview android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:textcolor="#ff0000"/> </linearlayout>
然后,我们需要在主界面里根据配置参数设置textview的外观以及背景,mainactivity.java代码如下:
package com.scott.prefs; import android.app.activity; import android.content.context; import android.content.intent; import android.content.sharedpreferences; import android.graphics.color; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.widget.textview; public class mainactivity extends activity { private static final int settings_id = 0; private static final int exit_id = 1; private textview textview; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); textview = (textview) findviewbyid(r.id.textview); showsettings(); } @override public boolean oncreateoptionsmenu(menu menu) { super.oncreateoptionsmenu(menu); menu.add(0, settings_id, 0, "settings"); menu.add(0, exit_id, 0, "quit"); return true; } @override public boolean onoptionsitemselected(menuitem item) { if (item.getitemid() == settings_id) { intent intent = new intent(mainactivity.this, prefsactivity.class); //如果requestcode >= 0 则返回结果时会回调 onactivityresult()方法 startactivityforresult(intent, 1); } else { finish(); } return true; } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); showsettings(); } private void showsettings() { string prefsname = getpackagename() + "_preferences"; //[package_name]_preferences sharedpreferences prefs = getsharedpreferences(prefsname, context.mode_private); string nickname = prefs.getstring("nickname", "机器人"); textview.settext("欢迎您:" + nickname); boolean nightmode = prefs.getboolean("nightmode", false); textview.setbackgroundcolor(nightmode ? color.black : color.white); string textsize = prefs.getstring("textsize", "0"); if (textsize.equals("0")) { textview.settextsize(18f); } else if (textsize.equals("1")) { textview.settextsize(22f); } else if (textsize.equals("2")) { textview.settextsize(36f); } } }
可以看到,进入主界面之后会根据[package_name]_preferences获取首选项配置信息,如果是首次进入,则使用默认值,下面就是我们首次进入主界面时的画面:
可以看到,我们初次进入的界面时昵称为“机器人”,字的背景为白色,字的大小为18号。
然后按下settings之后,我们就可以进行首选项的配置了,让我们先来看一下settings.xml的配置:
<?xml version="1.0" encoding="utf-8"?> <preferencescreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="settings" android:title="软件设置"> <preferencecategory android:key="basic" android:title="基本设置"> <edittextpreference android:key="nickname" android:title="昵称" android:defaultvalue="机器人"/> <checkboxpreference android:key="nightmode" android:title="夜间模式" android:summaryon="已启用" android:summaryoff="未启用"/> <listpreference android:key="textsize" android:title="文字大小" android:dialogtitle="文字大小" android:entries="@array/textsize_entry" android:entryvalues="@array/textsize_entry_value" android:defaultvalue="0"/> </preferencecategory> <preferencecategory android:key="clean" android:title="清除记录"> <preference android:key="cleanhistory" android:title="清除历史记录" /> </preferencecategory> </preferencescreen>
其中,最外层是preferencescreen标签,代表一系列首选项的集合;然后,我们注意到preferencecategory这一项,此标签代表一个类别,可以包含多个首选项;最后就是我们用于配置参数的首选项了。需要了解的是,preferencescreen也可以嵌套使用,也就是说上面的preferencecategory可以替换成preferencescreen。
此外,我们还需要了解一下文件中出现的几个常用标签属性:
- android:key 选项的名称或键
- android:title 选项的标题
- android:summary 选项的简短摘要
- android:entries 列表项的文本
- android:entryvalues 列表中每一项的值
- android:dialogtitle 对话框标题
- android:defalutvalue 列表中选项的默认值
- 对于checkboxpreference还有两个特殊的属性
- android:summaryon 选项被选中时显示的摘要
- android:summaryoff 选项未选中时显示的摘要
我们还可以看到,在listpreference中,entries来自于textsize_entry,而entryvalues来自于textsize_entry_value,这两项都在/res/values目录下的text_size.xml配置:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="textsize_entry"> <item>小</item> <item>中</item> <item>大</item> </string-array> <string-array name="textsize_entry_value"> <item>0</item> <item>1</item> <item>2</item> </string-array> </resources>
配置完成之后,我们就剩下最后一步了,创建activity,继承preferenceactivity,加载首选项资源文件,处理相应的选项事件。
prefsactivity.java代码如下:
package com.scott.prefs; import android.app.alertdialog; import android.content.dialoginterface; import android.os.bundle; import android.preference.edittextpreference; import android.preference.listpreference; import android.preference.preference; import android.preference.preferenceactivity; import android.preference.preferencescreen; import android.widget.toast; public class prefsactivity extends preferenceactivity implements preference.onpreferencechangelistener { private edittextpreference nickname; private listpreference textsize; private preference cleanhistory; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.xml.setttings); nickname = (edittextpreference) findpreference("nickname"); textsize = (listpreference) findpreference("textsize"); cleanhistory = findpreference("cleanhistory"); //为nickname和textsize注册preference.onpreferencechangelistener监听事件 //当值更改时我们可以立即更新summary nickname.setonpreferencechangelistener(this); textsize.setonpreferencechangelistener(this); initsummary(); } //初始化summary private void initsummary() { nickname.setsummary(nickname.gettext()); settextsizesummary(textsize.getvalue()); } private void settextsizesummary(string textsizevalue) { if (textsizevalue.equals("0")) { textsize.setsummary("小"); } else if (textsizevalue.equals("1")) { textsize.setsummary("中"); } else if (textsizevalue.equals("2")) { textsize.setsummary("大"); } } /** * 重写preferenceactivity的onpreferencetreeclick方法 * 在首选项被点击时 做出相应处理操作 */ @override public boolean onpreferencetreeclick(preferencescreen preferencescreen, preference preference) { if (preference == cleanhistory) { new alertdialog.builder(this) .settitle("清除历史记录") .setmessage("是否真的要清除历史记录?") .setpositivebutton("是", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { //cleaning history... toast.maketext(prefsactivity.this, "清除成功", toast.length_short).show(); } }).setnegativebutton("否", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { dialog.dismiss(); } }).create().show(); } return true; } /** * 重写preference.onpreferencechangelistener的onpreferencechange方法 * 当首选项的值更改时 做出相应处理操作 */ @override public boolean onpreferencechange(preference preference, object newvalue) { if (preference == nickname) { nickname.setsummary(newvalue.tostring()); } else if (preference == textsize) { settextsizesummary(newvalue.tostring()); } return true; } }
最后,别忘了在androidmanifest.xml中加入此activity配置信息:
<activity android:name=".prefsactivity"/>
当然我们也可以配置一下<intent-filter></intent-filter>属性。
经过以上几步,我们的首选项配置就完成了,首次进入的界面如下:
然后我们分别更改昵称、夜间模式、文字大小,如下:
可以看到,当我们更改了选项的值之后,摘要部分已经设置为最新值了,此时在我们应用下的shared_prefs目录中生成一个com.scott.prefs_preferences.xml文件,如图:
内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="nightmode" value="true" /> <string name="nickname">scott</string> <string name="textsize">2</string> </map>
此时,我们按回退键,回到主界面,发现刚才的设置已经生效了:
可以看到,昵称已经更改成“scott”,字的背景已更改为黑色,字的大小已更改为36号。
如果我们在首选项界面按下清除历史记录一项,将会出现一下界面:
原文链接:http://blog.csdn.net/liuhe688/article/details/6448423
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: java中request常用方法小结