本文转于 “雨松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. Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子

    Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子 第一个例子都是比较简单的博客园登录界面,就像学习编程语言时候都是从Hello,World!开始. 1 ...

  2. FZOJ--2221-- RunningMan 福建第六届省赛

    题目链接:http://acm.hust.edu.cn/vjudge/contest/127149#problem/J 题目大意: 因为总共就分三个队,因为两个队都要选取最优的策略,不论B队咋放,要使 ...

  3. 执行一条cmd命令的window.bat 批处理代码:

    . .执行一条cmd命令的window.bat 批处理代码: @echo off echo NodeJS SUPERVISOR...Server.js ::下面是批处理代码 supervisor d: ...

  4. UVA 11624 Fire! (bfs)

    算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...

  5. date 、cal、bc

    date cal date是显示日期与时间 date +%Y/%M/%D date +%Y/%m/%d date +%H:%M cal cal 2016

  6. Android——Cocosd2d-x手机游戏开发学习思路

    手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...

  7. 利用setTimeOut 和clearTimeOut 方法控制写一个 滑动导航显示不同信息的效果

    效果如图鼠标滑动导航  下边显示不同效果 html代码和css格式代码 <body><div id="tab" class="tab"> ...

  8. ASP.NET MVC- Controllers and Routing- Controller Overview

    In this tutorial, Stephen Walther introduces you to ASP.NET MVC controllers. You learn how to create ...

  9. swift小结01--基础篇

    2014年推出的swift目前已来到了3.0,日趋稳定,这个是之前学习整理的关于swift的资料,分享给大家,希望有用,写的不足的地方还请见谅. 语言背景:         Swift 语言由苹果公司 ...

  10. js获取几个月前,几周前时间。

    /**  *  DK 命名空间  防止全局变量污染  */ var DK = {} ; /**  * 获取前几个月,默认为一个月,当前时间  * @author duke  * @date 格式为yy ...