转:Android软件开发之PreferenceActivity中的组件

本文转于 “雨松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

时间: 2024-08-10 02:09:36

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

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

说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gradual-oneandroid软件开发之webView.addJavascriptInterface循环渐进[二]: http://www.sollyu.com/586 上一篇文章发布之后,得到

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/657171 ListView的使用方法 ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可

Android软件开发之TextView详解

Android软件开发之TextView详解<IGNORE_JS_OP> TextView的API 中文文档中 说明它的结构 结构java.lang.Object   android.view.View        android.widget.TextView直接子类:    Button, CheckedTextView, Chronometer, DigitalClock, EditText间接子类:     AutoCompleteTextView, CheckBox, Compou

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

本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gradual-one/ 说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/?p=302 android软件开发之webView.addJavascriptInterface循环渐进[二]: h

Android安全开发之WebView中的地雷

0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大,应用广泛,但它是天使与恶魔的合体,一方面它增强了APP的上网体验,让APP功能更多样化,另一方面它也引入了很多的安全问题.在过去几年WebView中被披露的重大漏洞包括了任意代码执行漏洞.跨域.密码明文保存等,这些安全问题可以直接导致用户敏感信息泄露,移动终端被恶意攻击者控制.下文将详细介绍这一系

Android软件开发之ListView学习

转自http://xys289187120.blog.51cto.com/3361352/657171/ ListView的使用方法 ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可以把列表中的数据映射到ListView中.在android的开发中最Adapter 一共可以分为A

Android软件开发之SharedPreferences

SharedPreferences 一种轻量级的数据保存方式 以键值对的方式存储 用于存储小批量的数据 使用方法: SharedPreferences sp= getSharedPreferences("myopt"(文件名),Context.MODE_PRIVATE(数据存储方式)); 存储文件名,数据将保存在/data/data/basepackage/shared_prefs/myopt.xml 存入数据 putXXX SharedPreferences.Editor edito

android软件开发之TextView控件常用属性

TextView控件 text属性,设置显示的文本 textColor:设置文本颜色 textSize:设置文本字体大小 autoLink:设置文本为电话,URL连接等的时候是否显示为可点击的链接 cursorVisible:设定光标为显示或者隐藏,默认为显示 drawableTop:在文本上方输出一个drawable,如图片 drawableLeft.drawableBottom.drawableRight如上 drawablePadding:设置图片的外边距 singleLine:设置单行显

Android 安全开发之 ZIP 文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有