本文转于 “雨松MOMO的程序世界” 博客,请务必保留此出处http://xys289187120.blog.51cto.com/3361352/656784

1.PreferenceActivity 介绍
PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的状态持久化储存,举个例子 比如用户选中checkbox后 退出应用然后在进入应用,这时用户希望看到的是checkbox被选中,所以软件须要记录用户每次操作的过程并且持久储存,在进入应用的时候须要判断这些久储存的数据然后将系统控件的状态呈现在UI中。
尤其是软件开发肯定会有一堆设置选项选项,每次进入Activity都去手动的去取储存的数据,这样代码会变得很复杂很麻烦。 这个时候Preference就出来了,它就是专门解决这些特殊的选项保存与读取的显示。用户每次操作事件它会及时的以键值对的形式记录在SharedPreferences中,Activity每次启动它会自动帮我们完成数据的读取以及UI的显示。
android开发中一共为我们提供了4个组件,分别是CheckBoxPreference组件、EditTextPreference组件、ListPreference组件、RingtonePreference组件,下面我用一个例子一一向同学们介绍一下。

2.CheckBoxPreference组件
CheckBoxPreference 选中为true 取消选中为false 它的值会以boolean的形式储存在SharedPreferences中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <PreferenceCategory android:title="CheckBoxPreference">
  5. <CheckBoxPreference android:key="checkbox_0"
  6. android:title="CheckBox_A"
  7. android:summary="这是一个勾选框A" >
  8. </CheckBoxPreference>
  9. <CheckBoxPreference android:key="checkbox_1"
  10. android:title="CheckBox_B"
  11. android:summary="这是一个勾选框B" >
  12. </CheckBoxPreference>
  13. </PreferenceCategory>
  14. </PreferenceScreen>

  1. import android.content.Context;
  2. import android.os.Bundle;
  3. import android.preference.CheckBoxPreference;
  4. import android.preference.Preference;
  5. import android.preference.PreferenceActivity;
  6. import android.preference.Preference.OnPreferenceChangeListener;
  7. import android.preference.Preference.OnPreferenceClickListener;
  8. import android.widget.Toast;
  9. public class CheckBoxActivity extends PreferenceActivity {
  10. Context mContext = null;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
  15. addPreferencesFromResource(R.xml.checkbox);
  16. mContext = this;
  17. //CheckBoxPreference组件
  18. CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");
  19. mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  20. @Override
  21. public boolean onPreferenceClick(Preference preference) {
  22. //这里可以监听到这个CheckBox 的点击事件
  23. return true;
  24. }
  25. });
  26. mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  27. @Override
  28. public boolean onPreferenceChange(Preference arg0, Object newValue) {
  29. //这里可以监听到checkBox中值是否改变了
  30. //并且可以拿到新改变的值
  31. Toast.makeText(mContext, "checkBox_0改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();
  32. return true;
  33. }
  34. });
  35. CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference("checkbox_1");
  36. mCheckbox1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  37. @Override
  38. public boolean onPreferenceClick(Preference preference) {
  39. //这里可以监听到这个CheckBox 的点击事件
  40. return true;
  41. }
  42. });
  43. mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  44. @Override
  45. public boolean onPreferenceChange(Preference arg0, Object newValue) {
  46. //这里可以监听到checkBox中值是否改变了
  47. //并且可以拿到新改变的值
  48. Toast.makeText(mContext, "checkBox_1改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();
  49. return true;
  50. }
  51. });
  52. }
  53. }

3.EditTextPreference组件
EditTextPreference 点击后会弹出一个输入框,输入的内容会以字符串的的形式储存在SharedPreferences中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <PreferenceCategory android:title="EditTextPreference">
  5. <EditTextPreference android:key="edit_0"
  6. android:title="输入信息_A"
  7. android:summary="请输入您的信息"
  8. android:defaultValue="请输入信息"
  9. android:dialogTitle="输入框">
  10. </EditTextPreference>
  11. <EditTextPreference android:key="edit_1"
  12. android:title="输入信息_B"
  13. android:summary="请输入您的信息"
  14. android:defaultValue="请输入信息"
  15. android:dialogTitle="输入框">
  16. </EditTextPreference>
  17. </PreferenceCategory>
  18. </PreferenceScreen>

  1. import android.content.Context;
  2. import android.os.Bundle;
  3. import android.preference.EditTextPreference;
  4. import android.preference.PreferenceActivity;
  5. public class EditTextActivity extends PreferenceActivity {
  6. Context mContext = null;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
  11. addPreferencesFromResource(R.xml.edittext);
  12. mContext = this;
  13. // EditTextPreference组件
  14. EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");
  15. //设置dialog按钮信息
  16. mEditText.setPositiveButtonText("确定");
  17. mEditText.setNegativeButtonText("取消");
  18. //设置按钮图标
  19. mEditText.setDialogIcon(R.drawable.jay);
  20. }
  21. }

4.ListPreference组件
在res/array中先写两个数组,一个用与list的显示内容,一个用户list的选中数值。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="auto_logout_time_key">
  4. <item>10 mins.</item>
  5. <item>20 mins.</item>
  6. <item>30 mins.</item>
  7. <item>60 mins.</item>
  8. </string-array>
  9. <string-array name="auto_logout_time_value">
  10. <item>600000</item>
  11. <item>1200000</item>
  12. <item>1800000</item>
  13. <item>3600000</item>
  14. </string-array>
  15. </resources>

ListPreference点击后会弹出一个列表框,选中后会将选中的内容(上面数组中的值)会以字符串的的形式储存在SharedPreferences中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <PreferenceCategory android:title="ListPreference">
  5. <ListPreference
  6. android:key="list_0"
  7. android:title="登录设置A"
  8. android:dialogTitle="选择在线时间"
  9. android:entries="@array/auto_logout_time_key"
  10. android:entryValues="@array/auto_logout_time_value" >
  11. </ListPreference>
  12. <ListPreference
  13. android:key="list_0"
  14. android:title="登录设置A"
  15. android:dialogTitle="选择在线时间"
  16. android:entries="@array/auto_logout_time_key"
  17. android:entryValues="@array/auto_logout_time_value" >
  18. </ListPreference>
  19. </PreferenceCategory>
  20. </PreferenceScreen>
  1. import android.os.Bundle;
  2. import android.preference.PreferenceActivity;
  3. public class ListActivity extends PreferenceActivity {
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
  8. addPreferencesFromResource(R.xml.list);
  9. }
  10. }

5.RingtonePreference组件
RingtonePreference点击后会弹出一个系统铃声的列表框,选中后会将选中的内容(uri字符集)会以字符串的的形式储存在SharedPreferences中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <PreferenceCategory android:title="RingtonePreference">
  5. <RingtonePreference
  6. android:key="ringtone_0"
  7. android:summary="选择系统铃声A"
  8. android:title="铃声设置"
  9. android:ringtoneType="all"
  10. android:showSilent="true" ></RingtonePreference>
  11. <RingtonePreference
  12. android:key="ringtone_!"
  13. android:summary="选择系统铃声B"
  14. android:title="铃声设置"
  15. android:ringtoneType="all"
  16. android:showSilent="true" ></RingtonePreference>
  17. </PreferenceCategory>
  18. </PreferenceScreen>

android:ringtoneType 系统一共提供了4中响铃模式的类型分别为 铃声(ringtone) 通知( notification) 警告(alarm) 全部(all)
模拟器默认是没有铃声的,下图中的铃声我是将歌曲文件拷贝到SD卡中,设置铃声后才会出现的。如果觉得拷贝麻烦可以使用豌豆荚或者91助手将歌曲文件放入手机SD卡中,在铃声设置那里设置一下在这里就会出现。

  1. import android.os.Bundle;
  2. import android.preference.PreferenceActivity;
  3. public class RingtoneActivity extends PreferenceActivity {
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
  8. addPreferencesFromResource(R.xml.ringtone);
  9. }
  10. }

5.自定义控件
使用系统的控件在显示方面难免会有些单一,如果想做一个好看的界面就需要使用自定义Preference。下面我简单说明一下如何编写自定义Preference。首先在res/layout中添加preferences文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="#00000000">
  6. <LinearLayout
  7. android:gravity="center_vertical"
  8. android:background="@drawable/preference_mid_background"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. >
  12. <ImageView
  13. android:focusable="false"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content" android:src="@drawable/setting_about_us">
  16. </ImageView>
  17. <RelativeLayout
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:layout_marginLeft="15dip"
  21. android:layout_marginTop="6dip"
  22. android:layout_marginRight="6dip"
  23. android:layout_marginBottom="6dip"
  24. android:layout_weight="1"
  25. >
  26. <TextView
  27. android:textSize="15dip"
  28. android:textColor="#000000"
  29. android:ellipsize="marquee"
  30. android:id="@+android:id/title"
  31. android:fadingEdge="horizontal"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:singleLine="true"
  35. >
  36. </TextView>
  37. <TextView
  38. android:textAppearance="?android:attr/textAppearanceSmall"
  39. android:textColor="#565656"
  40. android:id="@+android:id/summary"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:maxLines="4"
  44. android:layout_below="@+android:id/title"
  45. android:layout_alignLeft="@+android:id/title"
  46. >
  47. </TextView>
  48. </RelativeLayout>
  49. <ImageView
  50. android:focusable="false"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content"
  53. android:background="@drawable/preference_arrows"/>
  54. </LinearLayout>
  55. </LinearLayout>

android:background="@drawable/preference_mid_background"
通过这一行可以设置这个按钮的点击、选中默认的显示状态,这样可以让你的按钮更加好看。须要在res/drawable中添加xml文件

android:state_facused :为控件选中显示

android:state_pressed:为控件按下显示

最后一个为默认显示

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <item
  5. android:state_focused="true"
  6. android:drawable="@drawable/preference_mid_pressed"
  7. >
  8. </item>
  9. <item
  10. android:state_pressed="true"
  11. android:drawable="@drawable/preference_mid_pressed"
  12. >
  13. </item>
  14. <item
  15. android:drawable="@drawable/preference_mid"
  16. >
  17. </item>
  18. </selector>

  1. import android.content.Context;
  2. import android.os.Bundle;
  3. import android.preference.Preference;
  4. import android.preference.PreferenceActivity;
  5. import android.preference.Preference.OnPreferenceClickListener;
  6. import android.widget.Toast;
  7. public class AllActivity extends PreferenceActivity {
  8. /**自定义布局A**/
  9. Preference preference0 = null;
  10. /**自定义布局B**/
  11. Preference preference1 = null;
  12. Context mContext = null;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
  17. addPreferencesFromResource(R.xml.all);
  18. mContext = this;
  19. preference0 = findPreference("pref_key_0");
  20. preference0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  21. @Override
  22. public boolean onPreferenceClick(Preference preference) {
  23. Toast.makeText(mContext, "自定义布局A被按下", Toast.LENGTH_LONG).show();
  24. return false;
  25. }
  26. });
  27. preference1 = findPreference("pref_key_1");
  28. preference1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
  29. @Override
  30. public boolean onPreferenceClick(Preference preference) {
  31. Toast.makeText(mContext, "自定义布局B被按下", Toast.LENGTH_LONG).show();
  32. return false;
  33. }
  34. });
  35. }
  36. }

读取数据
在PreferenceActivity中可以用下面这种方式拿到SharedPreferences中储存的数值,通过PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默认储存的sharedPreferences对象。

  1. SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
  2. boolean something = prefs.getBoolean("something",false);

在模拟起中将SharedPreferences储存内容拷贝出来后,可以清楚的看到通过点击系统控件储存的数值。这里我说一下铃声的储存,它是以一个字符串形式的uri字符集,它所指向的是系统铃声储存的路径。所以根据这个字符集就可以找到这个铃声。

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <map>
  3. <string name="ringtone_!">content://media/external/audio/media/1</string>
  4. <string name="ringtone_0">content://media/external/audio/media/1</string>
  5. <string name="list_0">1800000</string>
  6. <string name="edit_1">请输入信息1212</string>
  7. <string name="list">1200000</string>
  8. <string name="ringtone">content://settings/system/ringtone</string>
  9. <boolean name="checkbox_0" value="true" />
  10. <boolean name="checkbox_1" value="true" />
  11. <string name="edit_0">请输入信息</string>
  12. </map>

代码下载地址:http://download.csdn.net/source/3556196

转:Android软件开发之PreferenceActivity中的组件的更多相关文章

  1. Android 软件开发之 PreferenceActivity 中的组件

    1.PreferenceActivity 介绍 PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的 ...

  2. Android安全开发之WebView中的地雷

    Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...

  3. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  4. android软件开发之webView.addJavascriptInterface循环渐进【一】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  5. Android软件开发之ListView 详解【转】

    ListView的使用方法  ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘 ...

  6. Android安全开发之WebView中的大坑

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  7. 【Android】Android软件开发之ListView 详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65717 ...

  8. Android软件开发之EditText 详解(八)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65718 ...

  9. Android软件开发之EditText 详解

    EditText在API中的结构 java.lang.Objectandroid.view.Viewandroid.widget.TextView        android.widget.Edit ...

随机推荐

  1. Java新手入门必须掌握的30个基本概念

    今天给大家推荐的文章是有关Java基本概念的,掌握好这些基本概念对学习J2SE.J2EE.J2ME都很重要,也能更好地理解Java的精髓,初学者要注意啦! ▶Java概述: 目前Java主要应用于中间 ...

  2. EF中使用存储过程

    1.存储过程使用out参数返回结果 存储过程: create or replace procedure PROC_GETSEQ(tbname varchar,ReturnNum out number) ...

  3. bzoj 2829 信用卡凸包(凸包)

    2829: 信用卡凸包 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1342  Solved: 577 [Submit][Status][Disc ...

  4. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  5. 批量导入图片到word并添加文件名

    Sub InsertPic() Dim myfile As FileDialog Set myfile = Application.FileDialog(msoFileDialogFilePicker ...

  6. HDU 4737 A Bit Fun 2013成都 网络赛 1010

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4737 题目大意:给定一系列数,F(i,j)表示对从ai到aj连续求或运算,(i<=j)求F(i, ...

  7. Java中url传递中文参数取值乱码的解决方法

    java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...

  8. curl测试puppet http api接口

    ---恢复内容开始--- 基于证书密钥对 curl --cert /etc/puppetlabs/puppet/ssl/certs/master.puppet.org.pem --key /etc/p ...

  9. MySQL DBA修炼秘籍

    0.导读 本文主要写给那些立志成为MySQL DBA,以及正在学习MySQL的同行们,结合个人及业内其他同行的职业发展经历给大家一些参考,如何成为合格的MySQL DBA. 1.什么是MySQL DB ...

  10. 应用程序无法正常启动0xc0150002 解决方式

        我也遇到过此问题,解决的方法: 方案一: 在项目的"属性|配置属性|链接器|常规"中的"启用增量链接"选择"否".此方法阻断了问题产 ...