PreferenceActivity(首选项设置页)

一、PreferenceActivity简介

  一直都以为软件的设置界面都是作者自己写的,今天才发现有个现成的PreferenceActivity可以使用,非常方便。大家都应该知道绝大多数应用都有选项页面,这里指的选项页面绝大多数使用过PreferenceActivity继承下来的(当然,如果你牛逼你也可以自己写)。如果你还不知道什么是Preference,请移步(http://blog.csdn.net/plussoft/article/details/9152573)。与其它偏好设置相同的,PreferenceActivity生成的信息也是用XML储存的。另外值得注意的是,通过PreferenceActivity生成的XML文件,命名方式是定死了的,生成的XML文件在data/data/<工程名>/shared_prefs/下,名字为“<工程名>_Preference.xml”,这是无法改变的。正式因为如此,PreferenceActivity生成的XML也被称为全局设置、应用设置,有着至高无上的地位。在PreferenceActivity中,所有的修改都会自动更新该XML文件,不需要我们手动去设置大量的监听。另外,我们还有必要复习一下各种获取SharedPreferences的方式:

一、getPreferences():可以获取当前Activity中的preference,这个方法我没用过(主要是没搞懂);

二、PreferenceManager.getDefaultSharedPreferences():顾名思义,获取全局变量的Preferences,也就是PreferenceActivity生成的Preference;

三、getSharedPreferences():可以获取该应用中全部的preferences,也就是在(http://blog.csdn.net/plussoft/article/details/9152573)所提到的。前面两种方法都是基于该方法的。

  回到PreferenceActivity。为了简化与preference相关的应用开发,Android为我们提供了一系列的api来帮助我们。在PreferenceActivity中,给我们提供了四个选项集成控件:ListPreference,EditTextPreference,CheckBoxPreference和RingtonePreference。如果还不能够满足你,那你唯有自行开发了。另外,RingtonePreference在此不做介绍,个人感觉真没什么用——有什么应用会要用到你的铃声呢?下面开始展示PreferenceActivity的独有魅力。


二、ListPreference

先来看看最终效果图:


功能不多阐述。来看看MainActivity代码:

[java]  view plain  copy
 print ?
  1. package com.plusjun.preference;  
  2.   
  3. import android.os.Bundle;  
  4. import android.preference.PreferenceActivity;  
  5.   
  6. /* 
  7.  * 要记得是继承PreferenceActivity而不是Activity 
  8.  */  
  9. public class MainActivity extends PreferenceActivity  {  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         /* 放入设置版面文件 
  14.          * 在这里,R.xml.mylistperference可以看作是布局文件 
  15.          */  
  16.         /* 
  17.          * addPreferencesFromResource方法在Android3.0中就被弃用了 
  18.          * 但却没有替代方法 
  19.          * 谷歌的想法是,希望我们继承PreferenceFragment来实现默认选项页 
  20.          * 但是这太难了。真的 
  21.          */  
  22.         addPreferencesFromResource(R.xml.mylistperference);  
  23.     }  
  24. }  

res/xml/mylistperference.xml布局文件

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!--   
  3.  对于该文件需要注意以下几点  
  4.  第一:位置。该文件的位置是在res/xml/下的。  
  5.  第二:格式,PreferenceScreen为根标签,ListPreference为子标签。PreferenceScreen可以看作是一个大的框架  
  6.  第三:标签属性含义  
  7.  android:key 唯一标识符,和android:id相类似,PreferenceManager可以以其为参数通过findPreference获取指定的preference  
  8.  注意,这个android:key的值也是Preference文件里面的XML“键”名  
  9.  android:title 大标题  
  10.  android:summary 标题下面的小字(这个要作为选项卡才有)  
  11.  android:entries 弹出的对话框中,列表显示的文本内容,注意哦,这里指定的是一个数组哦  
  12.  android:entryValues 与android:entries相对应的值  
  13.  android:defaultValue 当对应值不存在时的默认值  
  14.  android:dialogTitle 弹出的对话框中的标题信息  
  15.  更多的标签设置等你来发掘  
  16.  -->  
  17. <PreferenceScreen  
  18.   xmlns:android="http://schemas.android.com/apk/res/android"  
  19.   android:key="screen_list"  
  20.   android:title="标题"  
  21.   android:summary="说明摘要"  
  22.   >  
  23.   <ListPreference  
  24.     android:key="myListPreference"  
  25.     android:title="标题"  
  26.     android:summary="说明摘要"  
  27.     android:entries="@array/list_entries"  
  28.     android:entryValues="@array/list_entries_value"  
  29.     android:dialogTitle="这里是弹出框"  
  30.     android:defaultValue="@string/deflault_list_entries_value"  
  31.   ></ListPreference>  
  32.     
  33. </PreferenceScreen>  
我们的数据来源是在strings.xml文件中,这是一种良好的变成习惯。当然了,不一定要strings.xml文件,你可以自定义文件,但是不能有相同的标签。

在strings.xml中添加一下代码段:

[html]  view plain  copy
 print ?
  1. <string-array name="list_entries_value">  
  2.     <item>shandong</item>  
  3.     <item>fujian</item>  
  4.     <item>beijing</item>  
  5.     <item>hebei</item>  
  6. </string-array>  
  7.   
  8. <string-array name="list_entries">  
  9.     <item>山东</item>  
  10.     <item>福建</item>  
  11.     <item>北京</item>  
  12.     <item>河北</item>  
  13. </string-array>  
  14.   
  15. <string name="deflault_list_entries_value">beijing</string>  

在data/data/<工程名>/shared_prefs/下,名字为“<工程名>_Preference.xml“文件中,内容如下:

[html]  view plain  copy
 print ?
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
  2. <map>  
  3. <string name="myListPreference">fujian1</string>  
  4. </map>  

由此可见,android:key="myListPreference"正是XML中的键名值为我们选择的值。

三、CheckBoxPreference

效果如下:


我们继续拿上一个项目来修改。MainActivity仍保持不变:

[java]  view plain  copy
 print ?
  1. package com.plusjun.preference;  
  2.   
  3. import android.os.Bundle;  
  4. import android.preference.PreferenceActivity;  
  5.   
  6. public class MainActivity extends PreferenceActivity  {  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         addPreferencesFromResource(R.xml.mylistperference);  
  11.     }  
  12. }  

res/xml/checkbox.xml布局文件

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:key="screen_list"  
  4.     android:summary="说明摘要"  
  5.     android:title="标题" >  
  6.   
  7.     <CheckBoxPreference  
  8.         android:key="medf"  
  9.         android:summaryOff="马尔代夫未被选中"  
  10.         android:summaryOn="马尔代夫被选中了"  
  11.         android:title="马尔代夫" >  
  12.     </CheckBoxPreference>  
  13.     <CheckBoxPreference  
  14.         android:key="mlqs"  
  15.         android:summaryOff="毛里求斯未被选中"  
  16.         android:summaryOn="毛里求斯被选中了"  
  17.         android:title="毛里求斯" >  
  18.     </CheckBoxPreference>  
  19.   
  20. </PreferenceScreen>  

最终在“<工程名>_Preference.xml“生成的文件内容:

[html]  view plain  copy
 print ?
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
  2. <map>  
  3. <boolean name="medf" value="true" />  
  4. <boolean name="mlqs" value="false" />  
  5. </map>  

显然,CheckBoxPreference要比ListPreference简单多了。


四、EditTextPreference

效果图如下:


当我们点击主页面的输入名称时,就会弹出该对话框,让我们输入文字。

MainActivity仍保持不变:

[java]  view plain  copy
 print ?
  1. package com.plusjun.preference;  
  2.   
  3. import android.os.Bundle;  
  4. import android.preference.PreferenceActivity;  
  5.   
  6. public class MainActivity extends PreferenceActivity  {  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         addPreferencesFromResource(R.xml.mylistperference);  
  11.     }  
  12. }  

res/xml/checkbox.xml

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:key="edittext_screen"  
  4.     android:summary="屏幕简要说明"  
  5.     android:title="屏幕标题" >  
  6.   
  7.     <EditTextPreference  
  8.         android:dialogTitle="输入您的名称:"  
  9.         android:key="editWord"  
  10.         android:defaultValue="im human"  
  11.         android:summary="简要说明"  
  12.         android:title="输入名称" >  
  13.     </EditTextPreference>  
  14.   
  15. </PreferenceScreen>  

五、Preferences分组

目的很明显的,就是为了更美观。把不同类型的选项进行归类,提高用户体验。

首先第一种,就是制造二(多)级页面。只有点进去才会看到详细选项,如图:


MainActivity仍保持不变,res/xml/checkbox.xml:

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:key="edittext_screen"  
  4.     android:summary="屏幕简要说明"  
  5.     android:title="屏幕标题" >  
  6.   
  7.     <!-- 第一组 -->  
  8.     <PreferenceScreen  
  9.         xmlns:android="http://schemas.android.com/apk/res/android"  
  10.         android:key="edittext_screen"  
  11.         android:summary="点击进入第一组首选项"  
  12.         android:title="第一组" >  
  13.         <EditTextPreference  
  14.             android:dialogTitle="输入您的名称:"  
  15.             android:key="editTitlePreference1"  
  16.             android:summary="简要说明"  
  17.             android:title="输入名称" >  
  18.         </EditTextPreference>  
  19.     </PreferenceScreen>  
  20.   
  21.     <!-- 第二组 -->  
  22.     <PreferenceScreen  
  23.         xmlns:android="http://schemas.android.com/apk/res/android"  
  24.         android:key="edittext_screen"  
  25.         android:summary="点击进入第二组首选项"  
  26.         android:title="第二组" >  
  27.         <EditTextPreference  
  28.             android:dialogTitle="输入您的名称:"  
  29.             android:key="editTitlePreference2"  
  30.             android:summary="简要说明"  
  31.             android:title="输入名称" >  
  32.         </EditTextPreference>  
  33.     </PreferenceScreen>  
  34.   
  35.     <!-- 第三组 -->  
  36.     <PreferenceScreen  
  37.         xmlns:android="http://schemas.android.com/apk/res/android"  
  38.         android:key="edittext_screen"  
  39.         android:summary="点击进入第三组首选项"  
  40.         android:title="第三组" >  
  41.         <EditTextPreference  
  42.             android:dialogTitle="输入您的名称:"  
  43.             android:key="editTitlePreference3"  
  44.             android:summary="简要说明"  
  45.             android:title="输入名称" >  
  46.         </EditTextPreference>  
  47.     </PreferenceScreen>  
  48.   
  49. </PreferenceScreen>  

可以看出,PreferenceScreen本质上就是一个层次标签。

如果我们首选项的数目较少,但是我们依旧想为他们分组下,怎么办呢?

我们可以将上面代码中的嵌套PreferenceScreen改为PreferenceCategory,就这么简单!代码就不上了,效果如下:



以上部分内容转载或参考来源如下:

http://www.eoeandroid.com/thread-5305-1-1.html

http://www.pocketdigi.com/20110405/231.html

http://blog.csdn.net/flowingflying/article/details/6671548

http://blog.csdn.net/chenzheng_java/article/details/6285966

http://blog.csdn.net/chenzheng_java/article/details/6286037

http://blog.csdn.net/chenzheng_java/article/details/6286115

http://blog.csdn.net/chenzheng_java/article/details/6286195

在此表示感谢。
转载请注明来源,版权归原作者所有,未经同意严禁用于任何商业用途。
微博:http://weibo.com/theworldsong
邮箱:theworldsong@foxmail.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值