PreferenceActivity 全接触
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。同时Android还提供了OnPreferenceClickListener和OnPreferenceChangeListener两个与Preference相关的监听接口,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数,这样可以第一个时间向其他Activity等通知系统设置进行了改变
2.2 PreferenceCategory:一个分类分隔条。只有title属性有效。
2.3 PreferenceScreen:此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。
2.4 ListPreference:会弹出一个列表对话框供选择。
2.5 RingtonePreference:会弹出系统铃声列表供选择。
2.6 Preference:通用参数项。点击后需要程序自己响应事件。
3.自定义选项:
系统的提供的界面有时不能满足需要,这时就需要自定义选项了。
有两种方法可以实现自定义选项,一是用Preference作为选项,并重新实现onPreferenceTreeClick函数。
一是自定义一个类,类似于EditTextPreference这种系统内置的类,然后引用。
3.1使用一个Preference占位,然后重新实现onPreferenceTreeClick()函数:
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {String key = preference.getKey();if( key != null ){if(key.equals("some_key")) {showDialog(DIALOG_SOME_KEY);}}return super.onPreferenceTreeClick(preferenceScreen, preference);}
当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。
SharedPreferences.Editor editor = preference.getEditor();editor.putLong("ttt", 123);editor.commit();
此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。
android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了。
从上述界面中(其实是一个界面),我们可以看到有2组元素,第一组为:自动更新,更新频率。第二组为:是否登录,账号,密码。
其实分组是为了方便管理而已。这里主要使用到了选择,列表,编辑框等Preference.
我们还是来温习下基础知识吧。
一.基础知识
通常我们开发一个程序时,会需要给用户提供一个设置界面,使用户可以对程序的一些参数进行设置。通常我们使用Preferences的键值对存储方式,来对Android数据持久化。
android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种方式可以获取系统中持久化的数据,这些数据时存放在.xml中的:
1:public SharedPreferences getPreferences (int mode),只隶属于activity对象,并以这个对象为文件名。
2:public SharedPreferences getSharedPreferences (String name, int mode),隶属于整个应用,以name名称保存。
3:public static SharedPreferences getDefaultSharedPreferences (Context context),隶属于整个应用,保存PreferenceActivity中的设置,根据包名和PreferenceActivity的布局文件来起一个名字保存。
SharedPreferences可以保存Boolean、Int、Float、Long、String等类型。一般是SharedPreferences.Editor的putXXX()方法保存,并commit()方法提交;或者是remove(),方法移除,clear()方法清空,当然操作完毕后需要commit()方法提交。
一般的,可以使用SharedPreferences保存持久化数据,比如登陆账号,密码,以及相对固定设置参数等等,看你应用需要。
既然使用到设置参数界面,那么我们可以来认识下一下几个类标签:
1:PreferenceScreen 持久化设置界面的顶级容器,代表一屏,里面可以嵌套屏幕,嵌套的时候可以点击跳转到另外一屏。
2:PreferenceCategory 当前屏的分组容器,说白了,就是为了划分组而已。
3:CheckBoxPreference,ListPreference,EditTextPreference等等组件。这些都是常见的对应上述的选择标签、列表标签、编辑标签。
上述组件都有titile,summary,key属性。title标题描述,summary:详细描述,key:保存SharedPreferences时候的键。
二.实战
既然有了上述基础知识后,我们就可以来做如上的设置界面了,在上述界面中,我们知道当前配置界面只需一屏,没有额外的跳转,那么需要PreferenceScreen,不需要嵌套其他PreferenceScreen,而设置界面分为两栏,那么需要两个PreferenceCategory,并且这个PreferenceCategory可以设置标题。同时根据界面,我们还需要CheckBoxPreference,ListPreference,EditTextPreference等。操作如图:
当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在xml文件夹中,如下:
xml version=1.0 encoding=?>
PreferenceScreen xmlns:android=http://schemas.android.com/apk/res/android
android:title=@string/setting >
PreferenceCategory android:title=@string/update >
CheckBoxPreference
android:key=@string/update_key
android:summaryOn=@string/auto_update_switch_summary_on
android:summaryOff=@string/auto_update_switch_summary_off
android:summary=@string/auto_update_setting
android:title=@string/auto_update_switch_title
android:defaultValue=true
/>
ListPreference
android:key=@string/auto_update_frequency_key
android:dialogTitle=@string/auto_update_frequency_title
android:entries=@array/auto_frequency_name
android:entryValues=@array/auto_frequency_value
android:negativeButtonText=@string/cancel
android:summary=@string/auto_update_frequency_summary
android:title=@string/auto_update_frequency_title />
PreferenceCategory>
PreferenceCategory android:title=@string/other >
CheckBoxPreference
android:key=@string/isneilflag_key
android:title=@string/isneilflag
android:disableDependentsState=true
/>
EditTextPreference
android:dependency=@string/isneilflag_key
android:key=@string/username_key
android:summary=@string/username_summary
android:title=@string/username />
EditTextPreference
android:dependency=@string/isneilflag_key
android:key=@string/password_key
android:summary=@string/password_summary
android:title=@string/password />
PreferenceCategory>
PreferenceScreen>
当然这里使用到了一些文件,代码一并释放:
xml version=1.0 encoding=?>
resources>
string name=hello>Hello World, PreferenceActivityDemoActivity!string>
string name=app_name>PreferenceActivityDemostring>
string name=cancel>取消string>
string name=other>其他string>
string name=setting>设置string>
string name=update>更新string>
string name=auto_update_switch_title>自动更新string>
string name=auto_update_setting>自动更新设置string>
string name=auto_update_switch_summary_on>开启自动更新string>
string name=auto_update_switch_summary_off>关闭自动更新string>
string name=auto_update_frequency_title>更新频率string>
string name=auto_update_frequency_summary>设置更新周期string>
string name=isneilflag>是否匿名登录string>
string name=username>帐号string>
string name=password>密码string>
string name=username_summary>提供您帐号string>
string name=password_summary>提供您密码string>
string name=update_key>update_keystring>
string name=auto_update_frequency_key>auto_update_frequency_keystring>
string name=isneilflag_key>isneilflag_keystring>
string name=username_key>username_keystring>
string name=password_key>password_keystring>
resources>
xml version=1.0 encoding=?>
resources>
string-array name=auto_frequency_name>
item>10分钟item>
item>30分钟item>
item>1小时item>
item>12小时item>
string-array>
string-array name=auto_frequency_value>
item>10item>
item>30item>
item>60item>
item>720item>
string-array>
resources>
接下来,我们就来解释下xml文件夹中设置文件的一些内容吧:
android:key=@string/update_key 这个是我们持久化时SharedPreferences保存的键,
android:summaryOn=@string/auto_update_switch_summary_on 选中后显示内容
android:summaryOff=@string/auto_update_switch_summary_off 未选中后显示内容
android:summary=@string/auto_update_setting 平常状态显示内容
android:title=@string/auto_update_switch_title 标题
android:defaultValue=true 默认值
android:dialogTitle=@string/auto_update_frequency_title 对话框标题
android:entries=@array/auto_frequency_name 列表项显示名称
android:entryValues=@array/auto_frequency_value 列表项值
android:disableDependentsState=true 当CheckBoxPreference的值为真的时候,禁用依赖于该设置的其他设置项。
android:dependency=@string/isneilflag_key 根据上述设置依赖于CheckBoxPreference的真值进行启用与禁用。
注意:我们可以从上图知道ListPreference是继承之Preference,以及DialogPreference的,那么就有它们的属性以及方法了。
好了,设置界面已经定义完成,我们来定义一个activity继承之PreferenceActivity,并使之显示吧。
当然噩梦可以再使之继承接口OnPreferenceChangeListener,OnPreferenceClickListener,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数。
具体代码如下:
package com.dongzi;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
import android.preference.PreferenceActivity;
import android.util.Log;
public class PreferenceActivityDemoActivity extends PreferenceActivity
implements OnPreferenceChangeListener,OnPreferenceClickListener{
static final String TAG=PreferenceActivityDemoActivity;
SharedPreferences preference=null;
CheckBoxPreference updateCheckBoxPreference=null;
ListPreference lististPreference=null;
CheckBoxPreference isneilflag_CheckBoxPreference=null;
EditTextPreference usernameEditTextPreference=null;
EditTextPreference passwordEditTextPreference=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置显示Preferences
addPreferencesFromResource(R.xml.preference);
//获得SharedPreferences
preference=PreferenceManager.getDefaultSharedPreferences(this);
//找到preference对应的Key标签并转化
updateCheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.update_key));
lististPreference=(ListPreference)findPreference(getString(R.string.auto_update_frequency_key));
isneilflag_CheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.isneilflag_key));
usernameEditTextPreference=(EditTextPreference)findPreference(getString(R.string.username_key));
passwordEditTextPreference=(EditTextPreference)findPreference(getString(R.string.password_key));
//为Preference注册监听
updateCheckBoxPreference.setOnPreferenceChangeListener(this);
updateCheckBoxPreference.setOnPreferenceClickListener(this);
lististPreference.setOnPreferenceClickListener(this);
lististPreference.setOnPreferenceChangeListener(this);
isneilflag_CheckBoxPreference.setOnPreferenceChangeListener(this);
isneilflag_CheckBoxPreference.setOnPreferenceClickListener(this);
usernameEditTextPreference.setOnPreferenceChangeListener(this);
passwordEditTextPreference.setOnPreferenceChangeListener(this);
@Override
public boolean onPreferenceClick(Preference preference) {
//判断是哪个Preference改变了
Log.e(TAG, getString(R.string.update_key));
Log.e(TAG, getString(R.string.isneilflag_key));
//返回true表示允许改变
return true;
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//判断是哪个Preference改变了
//账号
Log.e(TAG, getString(R.string.username_key));
//密码
Log.e(TAG, getString(R.string.password_key));
//列表
Log.e(TAG, getString(R.string.auto_update_frequency_key));
//返回true表示允许改变
return true;
从上述代码可知:
1:设置显示Preferences可以调用方法addPreferencesFromResource(R.xml.preference); 传递preference文件即可。
2:然后通过findPreference();方法找到键的类标签
3:我们定义2个监听接口监听参数是否设置成功。
4:在监听接口中返回true就是设置允许提交。
结果打印如下:
成功!
也许你会问,我们这里并没有使用
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
settings.getXXXX();settings.putXXXX();以及commit()等方法,设置、获取并提交值啊?!是的,在这里我们不需这样,因为
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。
当然,您可以在其他界面使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);等类方法来获取数据,看能不能获取到.
PreferenceActivitu
为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢?
根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面构建 后者用于设置数据存放 其实 这是正确的 但是 这会比较繁琐 因为 每个设置选项 都要建立与其对应的Preference
所以 现在有更好的选择了 那就是本文的主角:PreferenceActivity
从名字应该可以看出 其实 Activity 与 Perference 的混合物
还是从需求说起 常见属性设定 有哪几种方式:
1. CheckBox 用于 确定/取消 某项功能 如:是否静音 对应于:CheckBoxPreference 其在Preference 有一个选项与其自动绑定 下同
2. ListView 用于列出所有选择 如:铃声选择 列出所有声音供选择使用 对应于:ListPreference
3. 属性结合 用于列出一系列相关属性 如:所有与短消息有关的功能 对应于:PreferenceScreen 该项仅用于界面 故与Preference无关
界面 其实 讨论这个 比较鸡肋 大家自己试着运行就一目了然了 所以 觉得还是以步骤为
鉴于PreferenceActivity使用 网络很多 故此略过 为了给自己备份 防止以后用到 大致叙述一下
[代码 步骤]
1.PreferenceActivity 界面比较特别 在 res/xml/setting.xml
Java代码- <?xmlversion="1.0"encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <CheckBoxPreference
- android:key="autoBack"
- android:title="自动回复"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="true"
- />
- <PreferenceCategoryandroid:title="SMS助手">
- <CheckBoxPreference
- android:key="smsSilence"
- android:title="静音"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="false"
- />
- <PreferenceScreenandroid:title="更多选项">
- <CheckBoxPreference
- android:key="cb21"
- android:title="功能1"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="true"
- />
- <CheckBoxPreference
- android:key="cb22"
- android:title="功能2"
- android:summaryOn="使用"
- android:summaryOff="停用"
- android:defaultValue="true"
- />
- <ListPreference
- android:key="list1"
- android:title="androidforum"
- android:summary="开发论坛"
- android:dialogTitle="请选择论坛"
- android:entries="@array/entries_list_preference"
- android:entryValues="@array/entriesvalue_list_preference"
- />
- <EditTextPreference
- android:key="et1"
- android:title="EditTextPreferenceSample"
- android:summary="点击输入"
- android:dialogTitle="输入设置"
- android:defaultValue="HelloEditTextPreference"
- />
- </PreferenceScreen>
- </PreferenceCategory>
- <PreferenceCategoryandroid:title="其他选项">
- <RingtonePreference
- android:key="rt1"
- android:title="RingtonePreferenceSample"
- android:summary="选择铃声"
- />
- </PreferenceCategory>
- </PreferenceScreen>
- <?xmlversion="1.0"encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <CheckBoxPreference
- android:key="autoBack"
- android:title="自动回复"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="true"
- />
- <PreferenceCategoryandroid:title="SMS助手">
- <CheckBoxPreference
- android:key="smsSilence"
- android:title="静音"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="false"
- />
- <PreferenceScreenandroid:title="更多选项">
- <CheckBoxPreference
- android:key="cb21"
- android:title="功能1"
- android:summaryOn="开启"
- android:summaryOff="关闭"
- android:defaultValue="true"
- />
- <CheckBoxPreference
- android:key="cb22"
- android:title="功能2"
- android:summaryOn="使用"
- android:summaryOff="停用"
- android:defaultValue="true"
- />
- <ListPreference
- android:key="list1"
- android:title="androidforum"
- android:summary="开发论坛"
- android:dialogTitle="请选择论坛"
- android:entries="@array/entries_list_preference"
- android:entryValues="@array/entriesvalue_list_preference"
- />
- <EditTextPreference
- android:key="et1"
- android:title="EditTextPreferenceSample"
- android:summary="点击输入"
- android:dialogTitle="输入设置"
- android:defaultValue="HelloEditTextPreference"
- />
- </PreferenceScreen>
- </PreferenceCategory>
- <PreferenceCategoryandroid:title="其他选项">
- <RingtonePreference
- android:key="rt1"
- android:title="RingtonePreferenceSample"
- android:summary="选择铃声"
- />
- </PreferenceCategory>
- </PreferenceScreen>
2. 导入setting.xml
Java代码- addPreferencesFromResource(R.xml.settings);
- addPreferencesFromResource(R.xml.settings);
emulator 运行截图:
点开"更多选项"
具体 请大家自己尝试之
3. 其实 关于PreferenceActivity 问题 基本结束了 但是 初次使用 会碰到一些坎坷 现一一讨论
4. 监听设定变化问题 普通布局里的监听 比较简单 先通过findViewById()获得目标View 再在其上注册监听器即可
但是 PreferenceActivity 并没有提供findViewById() 也就无法监听 那么 怎么做呢?
- 得到SharedPreferences 句柄
Java代码- sp=PreferenceManager.getDefaultSharedPreferences(this);
- sp=PreferenceManager.getDefaultSharedPreferences(this);
- 在 sp 之上注册改变监听器
Java代码- sp.registerOnSharedPreferenceChangeListener(newOnSharedPreferenceChangeListener(){
- @Override
- //sharedPreferences:句柄
- //key:改变键值
- publicvoidonSharedPreferenceChanged(
- SharedPreferencessharedPreferences,Stringkey){
- //TODOAuto-generatedmethodstub
- if(key.equals("autoBack")){
- BooleanautoBack=sharedPreferences.getBoolean("autoBack",false);
- if(autoBack){
- Log.d("TAG","autoBack:true!");
- }
- else{
- Log.d("TAG","autoBack:false!");
- }
- }
- }
- });
- sp.registerOnSharedPreferenceChangeListener(newOnSharedPreferenceChangeListener(){
- @Override
- //sharedPreferences:句柄
- //key:改变键值
- publicvoidonSharedPreferenceChanged(
- SharedPreferencessharedPreferences,Stringkey){
- //TODOAuto-generatedmethodstub
- if(key.equals("autoBack")){
- BooleanautoBack=sharedPreferences.getBoolean("autoBack",false);
- if(autoBack){
- Log.d("TAG","autoBack:true!");
- }
- else{
- Log.d("TAG","autoBack:false!");
- }
- }
- }
- });
5. Preference 异地使用 即:PreferenceActivity在一个应用程序 而别处应用程序可能也想改变该数据 怎么做呢?
- 通过getSharedPreferences() 得到SharedPreferences实例
Java代码- spc=this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml",MODE_WORLD_READABLE);
- spc=this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml",MODE_WORLD_READABLE);
- 取值
Java代码- BooleanautoBack=spc.getBoolean("autoBack",false);
- BooleanautoBack=spc.getBoolean("autoBack",false);
- 赋值
Java代码- publicvoidputValue(Stringkey,Booleanvalue){
- spe=spc.edit();
- spe.putBoolean(key,value);
- spe.commit();
- }
- publicvoidputValue(Stringkey,Booleanvalue){
- spe=spc.edit();
- spe.putBoolean(key,value);
- spe.commit();
- }
就这样结束 似乎感觉不爽 所以决定加点料
- ListPreference 使用
Java代码- <ListPreference
- android:key="list1"
- android:title="androidforum"
- android:summary="开发论坛"
- android:dialogTitle="请选择论坛"
- android:entries="@array/entries_list_preference"
- android:entryValues="@array/entriesvalue_list_preference"
- />
- <ListPreference
- android:key="list1"
- android:title="androidforum"
- android:summary="开发论坛"
- android:dialogTitle="请选择论坛"
- android:entries="@array/entries_list_preference"
- android:entryValues="@array/entriesvalue_list_preference"
- />
- EditTextPreference 使用
Java代码- <EditTextPreference
- android:key="et1"
- android:title="EditTextPreferenceSample"
- android:summary="点击输入"
- android:dialogTitle="输入设置"
- android:defaultValue="HelloEditTextPreference"
- />
- <EditTextPreference
- android:key="et1"
- android:title="EditTextPreferenceSample"
- android:summary="点击输入"
- android:dialogTitle="输入设置"
- android:defaultValue="HelloEditTextPreference"
- />
看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找。
PerferenceActivity是什么,看下面的截图:
Android系统截图(左) MusicPlayer Setting截图(右)
好了,我们看到Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理,那么它是怎么保存数据的呢,如何创建PrefenceActivity的呢,更关键是怎样触发相应事件的呢。
先看第一个问题,PreferenceActivity是如何保存的数据。对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvider。看出来了吧,Preference,对就是使用SharedPreferneces以键值对的形式进行保存的,当然,我们也可以通过SharedPreferences来获取PreferenceActivity设置的值。
第二个问题:如何创建一个PreferenceActivity。 其实Eclipse提供了相应的创建工具,和创建Layout是基本相同的。步骤如下:
创建Android项目,并添加一个Android xml文件。注意,这次选择的不是Layout,而是Preference,而且注意Folder路径是 res/xml.
添加完成之后,在res/xml/下打开添加的preference.xml文件。可以看到Android也为我们提供两种编辑模式,可视化的结构设计及xml源码设计。推荐使用structure进行创建。如图所示:
下面我们看看PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到以下几项:
CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:
EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。
ListPreference: 列表选择,弹出对话框供选择。
Preference:只进行文本显示,需要与其他进行组合使用。
PreferenceCategory:用于分组。效果如下:
PreferenceScreen:PreferenceActivity的根元素,必须为它。
RingtonePreference:系统玲声选择。
OK,Preferenc的基本元素介绍完毕,下一节将使用它们创建一个完整的Preference并进行显示。
-------------------------------------------------------------------------------
分析MusicPlayer Setting,第一部分为“我的位置”,包括“使用无线网线”和“使用GPS”两个部分,而且都是CheckBox,根据上节学习,应该包括一个PreferenceCategory和两个CheckBoxPreference。
Xml代码:
<PreferenceCategory android:title="我的位置" android:key="set_local"><CheckBoxPreference android:key="apply_wifi"android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
android:title="使用无线网络" android:defaultValue="true"></CheckBoxPreference><CheckBoxPreference android:key="apply_gps"android:summary="定位到街道级别(需要消耗更多的电量以及天气允许)"
android:title="使用GPS"></CheckBoxPreference></PreferenceCategory>
以上代码当然也可以用Android提供的IDE工具直接生成。视频结构如下:
PreferenceCategory属性分析:
title:显示的标题
key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 (以下相同)。
CheckBoxPreference属性分析:
Key:唯一标识.
title:显示标题(大字体显示)
summary:副标题(小字体显示)
defaultValue:默认值(当然,此处只能是true或false了)
Preference.xml的第二部分为“无线和网络设置”,此部分包括的内容比较多,也稍微复杂,一步一步来分析。
xml代码:
<PreferenceCategory android:title="无线和网络设置"><CheckBoxPreference android:key="apply_fly"android:summary="禁用所有无线连接" android:title="飞行模式"></CheckBoxPreference><CheckBoxPreference android:key="apply_internet"android:summary="禁用通过USB共享Internet连接"
android:title="Internet共享"></CheckBoxPreference><CheckBoxPreference android:key="apply_wifi"android:summary="打开Wi-Fi" android:title="Wi-Fi"></CheckBoxPreference><Preference android:summary="设置和管理无线接入点" android:title="Wi-Fi设置"android:dependency="apply_wifi" android:key="wifi_setting"></Preference><CheckBoxPreference android:key="apply_bluetooth"android:summary="启用蓝牙" android:title="蓝牙"></CheckBoxPreference><Preference android:summary="管理连接、设备设备名称和可检测性"android:title="蓝牙设置" android:dependency="apply_bluetooth"android:key="bluetooth_setting"></Preference><EditTextPreference android:key="number_edit"android:title="输入电话号码"></EditTextPreference><ListPreference android:title="部门设置" android:entries="@array/department"android:entryValues="@array/department_value"
android:dialogTitle="选择部门"android:key="depart_value"></ListPreference><RingtonePreference android:ringtoneType="all" android:title="玲聲"
android:showDefault="true" android:key="ring_key"
android:showSilent="true"></RingtonePreference></PreferenceCategory>
对应的Structure图:
第二部分中前三个都为CheckBoxPreference,不心多说,从<Preferenceandroid:key="bluetooth_setting"/>开始。
Preference属性分析:
Key:唯一标识.
title:显示标题(大字体显示)
summary:副标题(小字体显示)
dependency:附属(嘛意思),即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。上面代码中的Preference元素附属于key等于“apply_bluetooth”的CheckPreference元素,当CheckPreference值为true时,Preference则为可用,否则为不可用。
EditTextPreperence属性分析:
Key:唯一标识.
title:显示标题(大字体显示)
ListPreference属性分析:
Key:唯一标识.
title:显示标题(大字体显示)
dialogTitle:弹出对话框的标题
entries:列表中显示的值。为一个数组,通读通过资源文件进行设置。
entryValues:列表中实际保存的值,也entries对应。为一个数组,通读通过资源文件进行设置。以下代码显示的是arrays.xml文件中内容:
<resources><string-array name="department"><item>综合部</item><item>行政部</item><item>外贸部</item></string-array><string-array name="department_value"><item>001</item><item>002</item><item>003</item></string-array></resources>
RingtonePreference :玲声(暂时没有用到过),暂时略过。
OK,Preference.xml内容已经分析完毕,属性都大致相同,相信亲自动力一试也就那么回事。那么如何把Preference.xml中内容展现出来呢?
Layout是通过继续自Activity的类来进行显示的,前面提到过,PreferenceActivity是专门用于显示preference的,所以只要创建一个继承自PreferenceActivity类即可。代码如下:
public class Setting extends PreferenceActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 所的的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.preference);}}
接下来就是运行程序,显示劳动成果。至此,工作已经完成大半,所有的值都会保存到SharedPreferences中,我们也可以读取到保存的结果。
还有一个重要的问题,就是如何响应PreferenceActivity的操作。其实只要重写PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通过参数preference来判断是对那一个元素进行的,并根据需要进行操作。
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {return false;}
Ok,到此关于PreferenceActvity的想关内容就完了,日后有什么重大发现会补上。
更多相关文章
- Android之PullToRefresh(ListView 、GridView 、WebView)使用详
- 一个Activity的显示过程总结(二)
- Android(安卓)studio安装与调试
- Android中关于退出和Toast的引用
- Android(安卓)自定义弹窗 Dialog
- Activity跳转动画
- Android(安卓)ActionBar详解
- Android中Toolbar的使用
- Android(安卓)SimpleDateFormat 日期时间格式 系统设置12_24小时