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 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了。

Android的配置界面PreferenceActivity

Android的配置界面PreferenceActivity


  从上述界面中(其实是一个界面),我们可以看到有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等。操作如图:

Android的配置界面PreferenceActivity

Android的配置界面PreferenceActivity


  当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在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代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <PreferenceScreen   
  3.  xmlns:android="http://schemas.android.com/apk/res/android">   
  4.     <CheckBoxPreference   
  5.             android:key="autoBack"  
  6.             android:title="自动回复"  
  7.             android:summaryOn="开启"  
  8.             android:summaryOff="关闭"  
  9.             android:defaultValue="true"  
  10.         />   
  11.            
  12.     <PreferenceCategory android:title="SMS 助手">   
  13.         <CheckBoxPreference   
  14.                 android:key="smsSilence"  
  15.                 android:title="静音"  
  16.                 android:summaryOn="开启"  
  17.                 android:summaryOff="关闭"  
  18.                 android:defaultValue="false"  
  19.             />   
  20.         <PreferenceScreen android:title="更多选项">   
  21.             <CheckBoxPreference   
  22.                 android:key="cb21"  
  23.                 android:title="功能1"  
  24.                 android:summaryOn="开启"  
  25.                 android:summaryOff="关闭"  
  26.                 android:defaultValue="true"  
  27.             />   
  28.             <CheckBoxPreference   
  29.                 android:key="cb22"  
  30.                 android:title="功能2"  
  31.                 android:summaryOn="使用"  
  32.                 android:summaryOff="停用"  
  33.                 android:defaultValue="true"  
  34.             />   
  35.         <ListPreference   
  36.             android:key="list1"  
  37.             android:title="android forum"  
  38.             android:summary="开发论坛"  
  39.             android:dialogTitle="请选择论坛"  
  40.             android:entries="@array/entries_list_preference"  
  41.             android:entryValues="@array/entriesvalue_list_preference"  
  42.         />   
  43.         <EditTextPreference   
  44.         android:key="et1"  
  45.         android:title="EditTextPreference Sample"  
  46.         android:summary="点击输入"  
  47.         android:dialogTitle="输入设置"  
  48.         android:defaultValue="Hello EditTextPreference"  
  49.         />   
  50.         </PreferenceScreen>   
  51.     </PreferenceCategory>   
  52.        
  53.     <PreferenceCategory android:title="其他选项">   
  54.     <RingtonePreference   
  55.         android:key="rt1"  
  56.         android:title="RingtonePreference Sample"  
  57.         android:summary="选择铃声"  
  58.     />   
  59.     </PreferenceCategory>   
  60. </PreferenceScreen>  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen  
  3.  xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <CheckBoxPreference  
  5.             android:key="autoBack"  
  6.             android:title="自动回复"  
  7.             android:summaryOn="开启"  
  8.             android:summaryOff="关闭"  
  9.             android:defaultValue="true"  
  10.         />  
  11.           
  12.     <PreferenceCategory android:title="SMS 助手">  
  13.         <CheckBoxPreference  
  14.                 android:key="smsSilence"  
  15.                 android:title="静音"  
  16.                 android:summaryOn="开启"  
  17.                 android:summaryOff="关闭"  
  18.                 android:defaultValue="false"  
  19.             />  
  20.         <PreferenceScreen android:title="更多选项">  
  21.             <CheckBoxPreference  
  22.                 android:key="cb21"  
  23.                 android:title="功能1"  
  24.                 android:summaryOn="开启"  
  25.                 android:summaryOff="关闭"  
  26.                 android:defaultValue="true"  
  27.             />  
  28.             <CheckBoxPreference  
  29.                 android:key="cb22"  
  30.                 android:title="功能2"  
  31.                 android:summaryOn="使用"  
  32.                 android:summaryOff="停用"  
  33.                 android:defaultValue="true"  
  34.             />  
  35.         <ListPreference  
  36.             android:key="list1"  
  37.             android:title="android forum"  
  38.             android:summary="开发论坛"  
  39.             android:dialogTitle="请选择论坛"  
  40.             android:entries="@array/entries_list_preference"  
  41.             android:entryValues="@array/entriesvalue_list_preference"  
  42.         />  
  43.         <EditTextPreference  
  44.         android:key="et1"  
  45.         android:title="EditTextPreference Sample"  
  46.         android:summary="点击输入"  
  47.         android:dialogTitle="输入设置"  
  48.         android:defaultValue="Hello EditTextPreference"  
  49.         />  
  50.         </PreferenceScreen>  
  51.     </PreferenceCategory>  
  52.       
  53.     <PreferenceCategory android:title="其他选项">  
  54.     <RingtonePreference  
  55.         android:key="rt1"  
  56.         android:title="RingtonePreference Sample"  
  57.         android:summary="选择铃声"  
  58.     />  
  59.     </PreferenceCategory>  
  60. </PreferenceScreen>  

 

 

2. 导入setting.xml

 

Java代码 复制代码
  1. addPreferencesFromResource(R.xml.settings);  
  1. addPreferencesFromResource(R.xml.settings);  

 

  emulator 运行截图:

 

  

 

点开"更多选项"

 

 

 

 

具体 请大家自己尝试之

 

 

 

3. 其实 关于PreferenceActivity 问题 基本结束了 但是 初次使用 会碰到一些坎坷 现一一讨论

 

 

4. 监听设定变化问题    普通布局里的监听  比较简单 先通过findViewById()获得目标View  再在其上注册监听器即可

 

但是 PreferenceActivity 并没有提供findViewById()  也就无法监听 那么 怎么做呢?  

 

- 得到SharedPreferences 句柄

 

Java代码 复制代码
  1. sp = PreferenceManager.getDefaultSharedPreferences(this);  
  1. sp = PreferenceManager.getDefaultSharedPreferences(this);  

 

- 在 sp 之上注册改变监听器

 

Java代码 复制代码
  1. sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener(){   
  2.   
  3.                 @Override  
  4.                 //sharedPreferences:句柄  
  5.                 //key: 改变 键值  
  6.                 public void onSharedPreferenceChanged(   
  7.                         SharedPreferences sharedPreferences, String key) {   
  8.                     // TODO Auto-generated method stub  
  9.                        
  10.                     if(key.equals("autoBack")){   
  11.                         Boolean autoBack = sharedPreferences.getBoolean("autoBack"false);   
  12.                         if(autoBack){   
  13.                             Log.d("TAG","autoBack: true!");   
  14.                         }   
  15.                         else {   
  16.                             Log.d("TAG","autoBack: false!");   
  17.                         }   
  18.                     }   
  19.                 }   
  20.                    
  21.             });  
  1. sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener(){  
  2.   
  3.                 @Override  
  4.                 //sharedPreferences:句柄  
  5.                 //key: 改变 键值  
  6.                 public void onSharedPreferenceChanged(  
  7.                         SharedPreferences sharedPreferences, String key) {  
  8.                     // TODO Auto-generated method stub  
  9.                       
  10.                     if(key.equals("autoBack")){  
  11.                         Boolean autoBack = sharedPreferences.getBoolean("autoBack"false);  
  12.                         if(autoBack){  
  13.                             Log.d("TAG","autoBack: true!");  
  14.                         }  
  15.                         else {  
  16.                             Log.d("TAG","autoBack: false!");  
  17.                         }  
  18.                     }  
  19.                 }  
  20.                   
  21.             });  

 

 

 

5. Preference 异地使用 即:PreferenceActivity 在一个应用程序 而别处应用程序可能也想改变该数据   怎么做呢?

 

- 通过getSharedPreferences()  得到SharedPreferences实例

 

Java代码 复制代码
  1. spc = this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml", MODE_WORLD_READABLE );  
  1. spc = this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml", MODE_WORLD_READABLE );  

 

- 取值

 

Java代码 复制代码
  1. Boolean autoBack = spc.getBoolean("autoBack"false);  
  1. Boolean autoBack = spc.getBoolean("autoBack"false);  

 

- 赋值

 

Java代码 复制代码
  1. public void putValue(String key, Boolean value){   
  2.         spe = spc.edit();   
  3.         spe.putBoolean(key, value);   
  4.         spe.commit();   
  5.     }  
  1. public void putValue(String key, Boolean value){  
  2.         spe = spc.edit();  
  3.         spe.putBoolean(key, value);  
  4.         spe.commit();  
  5.     }  

 

 

 

就这样结束 似乎感觉不爽 所以决定加点料

 

 

- ListPreference 使用

 

Java代码 复制代码
  1. <ListPreference   
  2.             android:key="list1"  
  3.             android:title="android forum"  
  4.             android:summary="开发论坛"  
  5.             android:dialogTitle="请选择论坛"  
  6.             android:entries="@array/entries_list_preference"  
  7.             android:entryValues="@array/entriesvalue_list_preference"  
  8.         />  
  1. <ListPreference  
  2.             android:key="list1"  
  3.             android:title="android forum"  
  4.             android:summary="开发论坛"  
  5.             android:dialogTitle="请选择论坛"  
  6.             android:entries="@array/entries_list_preference"  
  7.             android:entryValues="@array/entriesvalue_list_preference"  
  8.         />  

 

 

 

 

- EditTextPreference 使用

 

Java代码 复制代码
  1. <EditTextPreference   
  2.         android:key="et1"  
  3.         android:title="EditTextPreference Sample"  
  4.         android:summary="点击输入"  
  5.         android:dialogTitle="输入设置"  
  6.         android:defaultValue="Hello EditTextPreference"  
  7.         />  
  1. <EditTextPreference  
  2.         android:key="et1"  
  3.         android:title="EditTextPreference Sample"  
  4.         android:summary="点击输入"  
  5.         android:dialogTitle="输入设置"  
  6.         android:defaultValue="Hello EditTextPreference"  
  7.         /> 

看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找。

PerferenceActivity是什么,看下面的截图:

image           image

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.

             image

添加完成之后,在res/xml/下打开添加的preference.xml文件。可以看到Android也为我们提供两种编辑模式,可视化的结构设计及xml源码设计。推荐使用structure进行创建。如图所示:

       image

下面我们看看PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到以下几项:

              image

CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:

            image

EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。

image 

ListPreference: 列表选择,弹出对话框供选择。

image 

Preference:只进行文本显示,需要与其他进行组合使用。

           image

 

 

 

 

 

 

 

PreferenceCategory:用于分组。效果如下:

          image

PreferenceScreen:PreferenceActivity的根元素,必须为它。

 

RingtonePreference:系统玲声选择。

         image

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工具直接生成。视频结构如下:

      image
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图:

         image

第二部分中前三个都为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 {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 所的的值将会自动保存到SharePreferences
		addPreferencesFromResource(R.xml.preference);
	}
}

 

接下来就是运行程序,显示劳动成果。至此,工作已经完成大半,所有的值都会保存到SharedPreferences中,我们也可以读取到保存的结果。

还有一个重要的问题,就是如何响应PreferenceActivity的操作。其实只要重写PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通过参数preference来判断是对那一个元素进行的,并根据需要进行操作。

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
		Preference preference) {
	return false;
}

 

Ok,到此关于PreferenceActvity的想关内容就完了,日后有什么重大发现会补上。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值