本文转于 “雨松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. python 零散记录(二) 序列的相关操作 相加 相乘 改变 复制

    序列相加: [1,2] + [3,4] == [1,2,3,4] #字符串也是序列的一种 'hello' + 'world' == 'hello world' #但是序列相加只限于相同类型的序列间相加 ...

  2. VS2013项目受源代码管理向源代码管理注册此项目时出错

    在使用TFS的时候有时出现无法加载项目,后来删除项目添加也是不行 编译项目的时候提示如题的错误,用记事本打开出错的几个项目的.csproj文件,把下面几行内容删掉就行了. <SccProject ...

  3. 理解c++11正则表达式 (1)

    概要 C++11提出了正则表达式这个概念,只需在头文件中包含#include<regex>即可.我们可以完成: Match 将整个输入拿来比对匹配某个正则表达式 Search 查找与正则表 ...

  4. basic mongodb

    basic mongodb */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Consola," ...

  5. SRM 447(1-250pt, 1-500pt)

    DIV1 250 水题...略. DIV1 500 抽象题意:有一个图,指定其中亮点p1和p2,删掉途中其他的一些点,使得p1和p2最短路大于3. 解法:使得p1和p2最短路为2的点一定要删掉.然后, ...

  6. [poj 2553]The Bottom of a Graph[Tarjan强连通分量]

    题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...

  7. Quartz定时任务学习(五)触发器

    顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...

  8. JMeter入门(1):JMeter总体介绍及组件介绍

    一.JMeter概述 JMeter就是一个测试工具,相比于LoadRunner等测试工具,此工具免费,且比较好用,但是前提当然是安装Java环境: JMeter可以做 (1)压力测试及性能测试: (2 ...

  9. 理解position 绝对定位和相对定位

    一.position的三种取值 1.取值 Position :   static /  absolute / fixed / relative static:静态   absolute:绝对定位    ...

  10. 王灏:光音网络致力打造Wi-Fi大生态圈

    光音网络,做的是本地网络综合服务.在中国,想把互联网做到覆盖延伸范围之外的最后100米,光音网络是当中一家,也是最坚持的一家.为千万家本地生活商户提供帮助,为数亿本地用户提供最佳的本地网络体验,这是光 ...