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代码
  1. <?xmlversion="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. <PreferenceCategoryandroid:title="SMS助手">
  12. <CheckBoxPreference
  13. android:key="smsSilence"
  14. android:title="静音"
  15. android:summaryOn="开启"
  16. android:summaryOff="关闭"
  17. android:defaultValue="false"
  18. />
  19. <PreferenceScreenandroid:title="更多选项">
  20. <CheckBoxPreference
  21. android:key="cb21"
  22. android:title="功能1"
  23. android:summaryOn="开启"
  24. android:summaryOff="关闭"
  25. android:defaultValue="true"
  26. />
  27. <CheckBoxPreference
  28. android:key="cb22"
  29. android:title="功能2"
  30. android:summaryOn="使用"
  31. android:summaryOff="停用"
  32. android:defaultValue="true"
  33. />
  34. <ListPreference
  35. android:key="list1"
  36. android:title="androidforum"
  37. android:summary="开发论坛"
  38. android:dialogTitle="请选择论坛"
  39. android:entries="@array/entries_list_preference"
  40. android:entryValues="@array/entriesvalue_list_preference"
  41. />
  42. <EditTextPreference
  43. android:key="et1"
  44. android:title="EditTextPreferenceSample"
  45. android:summary="点击输入"
  46. android:dialogTitle="输入设置"
  47. android:defaultValue="HelloEditTextPreference"
  48. />
  49. </PreferenceScreen>
  50. </PreferenceCategory>
  51. <PreferenceCategoryandroid:title="其他选项">
  52. <RingtonePreference
  53. android:key="rt1"
  54. android:title="RingtonePreferenceSample"
  55. android:summary="选择铃声"
  56. />
  57. </PreferenceCategory>
  58. </PreferenceScreen>
[java] view plain copy
  1. <?xmlversion="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. <PreferenceCategoryandroid:title="SMS助手">
  12. <CheckBoxPreference
  13. android:key="smsSilence"
  14. android:title="静音"
  15. android:summaryOn="开启"
  16. android:summaryOff="关闭"
  17. android:defaultValue="false"
  18. />
  19. <PreferenceScreenandroid:title="更多选项">
  20. <CheckBoxPreference
  21. android:key="cb21"
  22. android:title="功能1"
  23. android:summaryOn="开启"
  24. android:summaryOff="关闭"
  25. android:defaultValue="true"
  26. />
  27. <CheckBoxPreference
  28. android:key="cb22"
  29. android:title="功能2"
  30. android:summaryOn="使用"
  31. android:summaryOff="停用"
  32. android:defaultValue="true"
  33. />
  34. <ListPreference
  35. android:key="list1"
  36. android:title="androidforum"
  37. android:summary="开发论坛"
  38. android:dialogTitle="请选择论坛"
  39. android:entries="@array/entries_list_preference"
  40. android:entryValues="@array/entriesvalue_list_preference"
  41. />
  42. <EditTextPreference
  43. android:key="et1"
  44. android:title="EditTextPreferenceSample"
  45. android:summary="点击输入"
  46. android:dialogTitle="输入设置"
  47. android:defaultValue="HelloEditTextPreference"
  48. />
  49. </PreferenceScreen>
  50. </PreferenceCategory>
  51. <PreferenceCategoryandroid:title="其他选项">
  52. <RingtonePreference
  53. android:key="rt1"
  54. android:title="RingtonePreferenceSample"
  55. android:summary="选择铃声"
  56. />
  57. </PreferenceCategory>
  58. </PreferenceScreen>

2. 导入setting.xml

Java代码
  1. addPreferencesFromResource(R.xml.settings);
[java] view plain copy
  1. addPreferencesFromResource(R.xml.settings);

emulator 运行截图:

点开"更多选项"

具体 请大家自己尝试之

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

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

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

- 得到SharedPreferences 句柄

Java代码
  1. sp=PreferenceManager.getDefaultSharedPreferences(this);
[java] view plain copy
  1. sp=PreferenceManager.getDefaultSharedPreferences(this);

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

Java代码
  1. sp.registerOnSharedPreferenceChangeListener(newOnSharedPreferenceChangeListener(){
  2. @Override
  3. //sharedPreferences:句柄
  4. //key:改变键值
  5. publicvoidonSharedPreferenceChanged(
  6. SharedPreferencessharedPreferences,Stringkey){
  7. //TODOAuto-generatedmethodstub
  8. if(key.equals("autoBack")){
  9. BooleanautoBack=sharedPreferences.getBoolean("autoBack",false);
  10. if(autoBack){
  11. Log.d("TAG","autoBack:true!");
  12. }
  13. else{
  14. Log.d("TAG","autoBack:false!");
  15. }
  16. }
  17. }
  18. });
[java] view plain copy
  1. sp.registerOnSharedPreferenceChangeListener(newOnSharedPreferenceChangeListener(){
  2. @Override
  3. //sharedPreferences:句柄
  4. //key:改变键值
  5. publicvoidonSharedPreferenceChanged(
  6. SharedPreferencessharedPreferences,Stringkey){
  7. //TODOAuto-generatedmethodstub
  8. if(key.equals("autoBack")){
  9. BooleanautoBack=sharedPreferences.getBoolean("autoBack",false);
  10. if(autoBack){
  11. Log.d("TAG","autoBack:true!");
  12. }
  13. else{
  14. Log.d("TAG","autoBack:false!");
  15. }
  16. }
  17. }
  18. });

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

- 通过getSharedPreferences() 得到SharedPreferences实例

Java代码
  1. spc=this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml",MODE_WORLD_READABLE);
[java] view plain copy
  1. spc=this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml",MODE_WORLD_READABLE);

- 取值

Java代码
  1. BooleanautoBack=spc.getBoolean("autoBack",false);
[java] view plain copy
  1. BooleanautoBack=spc.getBoolean("autoBack",false);

- 赋值

Java代码
  1. publicvoidputValue(Stringkey,Booleanvalue){
  2. spe=spc.edit();
  3. spe.putBoolean(key,value);
  4. spe.commit();
  5. }
[java] view plain copy
  1. publicvoidputValue(Stringkey,Booleanvalue){
  2. spe=spc.edit();
  3. spe.putBoolean(key,value);
  4. spe.commit();
  5. }

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

- ListPreference 使用

Java代码
  1. <ListPreference
  2. android:key="list1"
  3. android:title="androidforum"
  4. android:summary="开发论坛"
  5. android:dialogTitle="请选择论坛"
  6. android:entries="@array/entries_list_preference"
  7. android:entryValues="@array/entriesvalue_list_preference"
  8. />
[java] view plain copy
  1. <ListPreference
  2. android:key="list1"
  3. android:title="androidforum"
  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="EditTextPreferenceSample"
  4. android:summary="点击输入"
  5. android:dialogTitle="输入设置"
  6. android:defaultValue="HelloEditTextPreference"
  7. />
[java] view plain copy
  1. <EditTextPreference
  2. android:key="et1"
  3. android:title="EditTextPreferenceSample"
  4. android:summary="点击输入"
  5. android:dialogTitle="输入设置"
  6. android:defaultValue="HelloEditTextPreference"
  7. />

看到很多书中都没有对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的想关内容就完了,日后有什么重大发现会补上。



更多相关文章

  1. Android之PullToRefresh(ListView 、GridView 、WebView)使用详
  2. 一个Activity的显示过程总结(二)
  3. Android(安卓)studio安装与调试
  4. Android中关于退出和Toast的引用
  5. Android(安卓)自定义弹窗 Dialog
  6. Activity跳转动画
  7. Android(安卓)ActionBar详解
  8. Android中Toolbar的使用
  9. Android(安卓)SimpleDateFormat 日期时间格式 系统设置12_24小时

随机推荐

  1. android小功能实现之文件读写
  2. Android(安卓)Build Error(1)
  3. Android(安卓)Studio 那些事| ' ' cannot
  4. alsa asound.conf
  5. android中activity的生命周期
  6. Android官方提供的支持不同屏幕大小的全
  7. Android(安卓)Uri,Path与File、Bitmap的相
  8. 安卓7.0及以上用户证书导入的问题
  9. android 7.0 有关wifi热点设置信息
  10. Android设计模式系列--适配器模式