分享

Android的配置界面PreferenceActivity

 东茹阁 2013-07-05
发表于 2012-8-3 17:00:23 |只看该作者 |倒序浏览
0
本帖最后由 nba 于 2012-8-3 17:02 编辑

我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了。

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

2012010517211979.jpg

2012010517213046.jpg

当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在xml文件夹中,如下:

  1. View Code [/align][align=left]<?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen xmlns:android="http://schemas./apk/res/android"
  3.     android:title="@string/setting" >
  4.     <PreferenceCategory android:title="@string/update" >
  5.         <CheckBoxPreference
  6.             android:key="@string/update_key"
  7.             android:summaryOn="@string/auto_update_switch_summary_on"
  8.             android:summaryOff="@string/auto_update_switch_summary_off"
  9.             android:summary="@string/auto_update_setting"
  10.             android:title="@string/auto_update_switch_title"
  11.             android:defaultValue="true"
  12.              />
  13.         <ListPreference
  14.             android:key="@string/auto_update_frequency_key"
  15.             android:dialogTitle="@string/auto_update_frequency_title"
  16.             android:entries="@array/auto_frequency_name"
  17.             android:entryValues="@array/auto_frequency_value"
  18.             android:negativeButtonText="@string/cancel"
  19.             android:summary="@string/auto_update_frequency_summary"
  20.             android:title="@string/auto_update_frequency_title" />
  21.     </PreferenceCategory>
  22.     <PreferenceCategory android:title="@string/other" >
  23.         <CheckBoxPreference
  24.             android:key="@string/isneilflag_key"
  25.             android:title="@string/isneilflag"
  26.             android:disableDependentsState="true"
  27.             />
  28.         <EditTextPreference
  29.             android:dependency="@string/isneilflag_key"
  30.             android:key="@string/username_key"
  31.             android:summary="@string/username_summary"
  32.             android:title="@string/username" />
  33.         <EditTextPreference
  34.             android:dependency="@string/isneilflag_key"
  35.             android:key="@string/password_key"
  36.             android:summary="@string/password_summary"
  37.             android:title="@string/password" />
  38.     </PreferenceCategory>
  39. </PreferenceScreen>
复制代码
当然这里使用到了一些文件,代码一并释放:

  1. View Code [/align][align=left]<?xml version="1.0" encoding="utf-8"?>
  2. <resources>[/align][align=left]    <string name="hello">Hello World, PreferenceActivityDemoActivity!</string>
  3.     <string name="app_name">PreferenceActivityDemo</string>
  4.     <string name="cancel">取消</string>
  5.     <string name="other">其他</string>
  6.     <string name="setting">设置</string>
  7.     <string name="update">更新</string>
  8.     <string name="auto_update_switch_title">自动更新</string>
  9.     <string name="auto_update_setting">自动更新设置</string>  
  10.     <string name="auto_update_switch_summary_on">开启自动更新</string>  
  11.     <string name="auto_update_switch_summary_off">关闭自动更新</string>  
  12.     <string name="auto_update_frequency_title">更新频率</string>  
  13.     <string name="auto_update_frequency_summary">设置更新周期</string>
  14.    
  15.     <string name="isneilflag">是否匿名登录</string>
  16.     <string name="username">账号</string>  
  17.     <string name="password">密码</string>
  18.     <string name="username_summary">提供您账号</string>  
  19.     <string name="password_summary">提供您密码</string>  
  20.    
  21.    
  22.     <string name="update_key">update_key</string>
  23.     <string name="auto_update_frequency_key">auto_update_frequency_key</string>
  24.     <string name="isneilflag_key">isneilflag_key</string>  
  25.     <string name="username_key">username_key</string>  
  26.     <string name="password_key">password_key</string>  
  27. </resources>
复制代码

  1. View Code [/align][align=left]<?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.     <string-array name="auto_frequency_name">
  4.         <item>10分钟</item>  
  5.         <item>30分钟</item>  
  6.         <item>1小时</item>  
  7.         <item>12小时</item>
  8.     </string-array>
  9.    
  10.     <string-array name="auto_frequency_value">
  11.         <item>10</item>  
  12.         <item>30</item>  
  13.         <item>60</item>  
  14.         <item>720</item>
  15.     </string-array>
  16. </resources>
复制代码
接下来,我们就来解释下xml文件夹中设置文件的一些内容吧:

  1. android:key="@string/update_key"   这个是我们持久化时SharedPreferences保存的键,
  2.             android:summaryOn="@string/auto_update_switch_summary_on"     选中后显示内容
  3.             android:summaryOff="@string/auto_update_switch_summary_off"     未选中后显示内容
  4.             android:summary="@string/auto_update_setting"                             平常状态显示内容
  5.             android:title="@string/auto_update_switch_title"                               标题
  6.             android:defaultValue="true"                                                             默认值
  7.   android:dialogTitle="@string/auto_update_frequency_title"                           对话框标题
  8.             android:entries="@array/auto_frequency_name"                                列表项显示名称
  9.             android:entryValues="@array/auto_frequency_value"                          列表项值  android:disableDependentsState="true"          当CheckBoxPreference的值为真的时候,禁用依赖于该设置的其他设置项。
  10.   android:dependency="@string/isneilflag_key"  根据上述设置依赖于CheckBoxPreference的真值进行启用与禁用。

复制代码
注意:我们可以从上图知道ListPreference是继承之Preference,以及DialogPreference的,那么就有它们的属性以及方法了。 好了,设置界面已经定义完成,我们来定义一个activity继承之PreferenceActivity,并使之显示吧。
当然噩梦可以再使之继承接口OnPreferenceChangeListener,OnPreferenceClickListener,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数。
具体代码如下:

  1. View Code [/font]
  2. [font=微软雅黑]package com.dongzi;[/font]
  3. [font=微软雅黑]import android.content.SharedPreferences;
  4. import android.os.Bundle;
  5. import android.preference.CheckBoxPreference;
  6. import android.preference.EditTextPreference;
  7. import android.preference.ListPreference;
  8. import android.preference.Preference;
  9. import android.preference.Preference.OnPreferenceChangeListener;
  10. import android.preference.Preference.OnPreferenceClickListener;
  11. import android.preference.PreferenceManager;
  12. import android.preference.PreferenceActivity;
  13. import android.util.Log;
  14. public class PreferenceActivityDemoActivity extends PreferenceActivity
  15.           implements OnPreferenceChangeListener,OnPreferenceClickListener{
  16.     static final String TAG="PreferenceActivityDemoActivity";
  17.     SharedPreferences preference=null;
  18.     CheckBoxPreference updateCheckBoxPreference=null;
  19.     ListPreference lististPreference=null;
  20.     CheckBoxPreference  isneilflag_CheckBoxPreference=null;
  21.     EditTextPreference usernameEditTextPreference=null;
  22.     EditTextPreference passwordEditTextPreference=null;
  23.     @Override
  24.     public void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         //设置显示Preferences
  27.         addPreferencesFromResource(R.xml.preference);
  28.         //获得SharedPreferences
  29.         preference=PreferenceManager.getDefaultSharedPreferences(this);
  30.         
  31.         //找到preference对应的Key标签并转化
  32.         updateCheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.update_key));
  33.         lististPreference=(ListPreference)findPreference(getString(R.string.auto_update_frequency_key));
  34.         isneilflag_CheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.isneilflag_key));
  35.         usernameEditTextPreference=(EditTextPreference)findPreference(getString(R.string.username_key));
  36.         passwordEditTextPreference=(EditTextPreference)findPreference(getString(R.string.password_key));
  37.         //为Preference注册监听
  38.         updateCheckBoxPreference.setOnPreferenceChangeListener(this);
  39.         updateCheckBoxPreference.setOnPreferenceClickListener(this);
  40.         
  41.         lististPreference.setOnPreferenceClickListener(this);
  42.         lististPreference.setOnPreferenceChangeListener(this);
  43.         
  44.         isneilflag_CheckBoxPreference.setOnPreferenceChangeListener(this);
  45.         isneilflag_CheckBoxPreference.setOnPreferenceClickListener(this);
  46.         
  47.         usernameEditTextPreference.setOnPreferenceChangeListener(this);
  48.         passwordEditTextPreference.setOnPreferenceChangeListener(this);
  49.     }
  50.     @Override
  51.     public boolean onPreferenceClick(Preference preference) {
  52.         //判断是哪个Preference改变了
  53.          if(preference.getKey().equals(getString(R.string.update_key))){
  54.              Log.e(TAG, getString(R.string.update_key));
  55.          }else if(preference.getKey().equals(getString(R.string.isneilflag_key))){
  56.              Log.e(TAG, getString(R.string.isneilflag_key));
  57.          }
  58.         //返回true表示允许改变  
  59.         return true;  
  60.     }
  61.     @Override
  62.     public boolean onPreferenceChange(Preference preference, Object newValue) {
  63.         //判断是哪个Preference改变了
  64.          if(preference.getKey().equals(getString(R.string.username_key))){
  65.             //账号
  66.              Log.e(TAG, getString(R.string.username_key));
  67.          }else if(preference.getKey().equals(getString(R.string.password_key))){
  68.              //密码
  69.              Log.e(TAG, getString(R.string.password_key));
  70.             
  71.          }else if(preference.getKey().equals(getString(R.string.auto_update_frequency_key))){
  72.              //列表
  73.              Log.e(TAG, getString(R.string.auto_update_frequency_key));
  74.          }
  75.         //返回true表示允许改变  
  76.         return true;  
  77.     }
  78. }
复制代码

从上述代码可知:

1:设置显示Preferences可以调用方法addPreferencesFromResource(R.xml.preference); 传递preference文件即可。
2:然后通过findPreference();方法找到键的类标签
3:我们定义2个监听接口监听参数是否设置成功。
4:在监听接口中返回true就是设置允许提交。

结果打印如下:
2012010518084318.jpg

成功!

也许你会问,我们这里并没有使用

  1. SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
复制代码
settings.getXXXX();settings.putXXXX();以及commit()等方法,设置、获取并提交值啊?!是的,在这里我们不需这样,因为
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。

当然,您可以在其他界面使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);等类方法来获取数据,看能不能获取到

补充:
http://www./thread-155390-1-1.html

附加篇(From:http://www./forum.php?mod=viewthread&tid=42895):
Android PreferenceActivity 详解教程














本帖最后由 台风眼 于 2010-11-8 18:12 编辑

为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢?

根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面构建 后者用于设置数据存放  其实 这是正确的 但是 这会比较繁琐 因为 每个设置选项 都要建立与其对应的Preference 

所以  现在有更好的选择了 那就是本文的主角:PreferenceActivity 
从名字应该可以看出 其实 Activity 与 Perference 的混合物

还是从需求说起  常见属性设定  有哪几种方式:

1. CheckBox  用于 确定/取消  某项功能    如:是否静音   对应于:CheckBoxPreference   其在Preference 有一个选项与其自动绑定 下同

2.  ListView 用于列出所有选择  如:铃声选择 列出所有声音供选择使用  对应于:ListPreference

3.  属性结合 用于列出一系列相关属性 如:所有与短消息有关的功能 对应于:PreferenceScreen  该项仅用于界面 故与Preference无关

界面 其实 讨论这个 比较鸡肋 大家自己试着运行就一目了然了  所以 觉得还是以步骤为主

鉴于PreferenceActivity使用 网络很多 故此略过 为了给自己备份 防止以后用到 大致叙述一下
[代码 步骤]
1.  PreferenceActivity  界面比较特别 在 res/xml/setting.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas./apk/res/android">
  4. <CheckBoxPreference
  5. android:key="autoBack"
  6. android:title="自动回复"
  7. android:summaryOn="开启"
  8. android:summaryOff="关闭"
  9. android:defaultValue="true"
  10. />

  11. <PreferenceCategory android:title="SMS 助手">
  12. <CheckBoxPreference
  13. android:key="smsSilence"
  14. android:title="静音"
  15. android:summaryOn="开启"
  16. android:summaryOff="关闭"
  17. android:defaultValue="false"
  18. />
  19. <PreferenceScreen android: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="android forum"
  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="EditTextPreference Sample"
  45. android:summary="点击输入"
  46. android:dialogTitle="输入设置"
  47. android:defaultValue="Hello EditTextPreference"
  48. />
  49. </PreferenceScreen>
  50. </PreferenceCategory>

  51. <PreferenceCategory android:title="其他选项">
  52. <RingtonePreference
  53. android:key="rt1"
  54. android:title="RingtonePreference Sample"
  55. android:summary="选择铃声"
  56. />
  57. </PreferenceCategory>
  58. </PreferenceScreen>
复制代码
2. 导入setting.xml
  1. addPreferencesFromResource(R.xml.settings);
复制代码
emulator 运行截图:
1.jpg 

点开"更多选项"
2.jpg 

具体 请大家自己尝试之

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

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

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

- 得到SharedPreferences 句柄
  1. sp = PreferenceManager.getDefaultSharedPreferences(this);
复制代码
- 在 sp 之上注册改变监听器
  1. sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener(){

  2. @Override
  3. //sharedPreferences:句柄
  4. //key: 改变 键值
  5. public void onSharedPreferenceChanged(
  6. SharedPreferences sharedPreferences, String key) {
  7. // TODO Auto-generated method stub

  8. if(key.equals("autoBack")){
  9. Boolean autoBack = 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实例
  1. spc = this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml", MODE_WORLD_READABLE );
复制代码
- 取值
  1. Boolean autoBack = spc.getBoolean("autoBack", false);
复制代码
- 赋值
  1. public void putValue(String key, Boolean value){
  2. spe = spc.edit();
  3. spe.putBoolean(key, value);
  4. spe.commit();
  5. }
复制代码
就这样结束 似乎感觉不爽 所以决定加点料

- ListPreference 使用
  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. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="entries_list_preference">
  4. <item>www.anddev.org</item>
  5. <item>www.</item>
  6. <item>developer.</item>
  7. </string-array>
  8. <string-array name="entriesvalue_list_preference">
  9. <item>1</item>
  10. <item>2</item>
  11. <item>3</item>
  12. </string-array>
  13. </resources>
复制代码
3.jpg 

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多