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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory

android:title="CheckBoxPreference">

<CheckBoxPreference

android:key="checkbox_0"

android:title="CheckBox_A"

android:summary="这是一个勾选框A" >

</CheckBoxPreference>

<CheckBoxPreference

android:key="checkbox_1"

android:title="CheckBox_B"

android:summary="这是一个勾选框B" >

</CheckBoxPreference>

</PreferenceCategory>

</PreferenceScreen>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

import android.content.Context;

import android.os.Bundle;

import android.preference.CheckBoxPreference;

import android.preference.Preference;

import android.preference.PreferenceActivity;

import android.preference.Preference.OnPreferenceChangeListener;

import android.preference.Preference.OnPreferenceClickListener;

import android.widget.Toast;

public class CheckBoxActivity extends PreferenceActivity

{

Context mContext = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences

addPreferencesFromResource(R.xml.checkbox);

mContext = this;

//CheckBoxPreference组件

CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");

mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener()

{

@Override

public boolean onPreferenceClick(Preference preference)

{

//这里可以监听到这个CheckBox 的点击事件

return true;

}

});

mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener()

{

@Override

public boolean onPreferenceChange(Preference arg0, Object newValue)

{

//这里可以监听到checkBox中值是否改变了

//并且可以拿到新改变的值

Toast.makeText(mContext, "checkBox_0改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();

return true;

}

});

CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference("checkbox_1");

mCheckbox1.setOnPreferenceClickListener(new OnPreferenceClickListener()

{

@Override

public boolean onPreferenceClick(Preference preference)

{

//这里可以监听到这个CheckBox 的点击事件

return true;

}

});

mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener()

{

@Override

public boolean onPreferenceChange(Preference arg0, Object newValue)

{

//这里可以监听到checkBox中值是否改变了

//并且可以拿到新改变的值

Toast.makeText(mContext, "checkBox_1改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();

return true;

}

});

}

}

3.EditTextPreference组件

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory

android:title="EditTextPreference">

<EditTextPreference

android:key="edit_0"

android:title="输入信息_A"

android:summary="请输入您的信息"

android:defaultValue="请输入信息"

android:dialogTitle="输入框">

</EditTextPreference>

<EditTextPreference

android:key="edit_1"

android:title="输入信息_B"

android:summary="请输入您的信息"

android:defaultValue="请输入信息"

android:dialogTitle="输入框">

</EditTextPreference>

</PreferenceCategory>

</PreferenceScreen>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import android.content.Context;

import android.os.Bundle;

import android.preference.EditTextPreference;

import android.preference.PreferenceActivity;

public class EditTextActivity extends PreferenceActivity

{

Context mContext = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences

addPreferencesFromResource(R.xml.edittext);

mContext = this;

// EditTextPreference组件

EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");

//设置dialog按钮信息

mEditText.setPositiveButtonText("确定");

mEditText.setNegativeButtonText("取消");

//设置按钮图标

mEditText.setDialogIcon(R.drawable.jay);

}

}

4.ListPreference组件

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string-array name="auto_logout_time_key">

<item>10 mins.</item>

<item>20 mins.</item>

<item>30 mins.</item>

<item>60 mins.</item>

</string-array>

<string-array name="auto_logout_time_value">

<item>600000</item>

<item>1200000</item>

<item>1800000</item>

<item>3600000</item>

</string-array>

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory

android:title="ListPreference">

<ListPreference

android:key="list_0"

android:title="登录设置A"

android:dialogTitle="选择在线时间"

android:entries="@array/auto_logout_time_key"

android:entryValues="@array/auto_logout_time_value" >

</ListPreference>

<ListPreference

android:key="list_0"

android:title="登录设置A"

android:dialogTitle="选择在线时间"

android:entries="@array/auto_logout_time_key"

android:entryValues="@array/auto_logout_time_value" >

</ListPreference>

</PreferenceCategory>

</PreferenceScreen>

1

2

3

4

5

6

7

8

9

10

11

import android.os.Bundle;

import android.preference.PreferenceActivity;

public class ListActivity extends PreferenceActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences

addPreferencesFromResource(R.xml.list);

}

}

5.RingtonePreference组件

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory

android:title="RingtonePreference">

<RingtonePreference

android:key="ringtone_0"

android:summary="选择系统铃声A"

android:title="铃声设置"

android:ringtoneType="all"

android:showSilent="true" >

</RingtonePreference>

<RingtonePreference

android:key="ringtone_!"

android:summary="选择系统铃声B"

android:title="铃声设置"

android:ringtoneType="all"

android:showSilent="true" >

</RingtonePreference>

</PreferenceCategory>

</PreferenceScreen>

android:ringtoneType 系统一共提供了4中响铃模式的类型分别为  铃声(ringtone)  通知( notification) 警告(alarm) 全部(all)

模拟器默认是没有铃声的,下图中的铃声我是将歌曲文件拷贝到SD卡中,设置铃声后才会出现的。如果觉得拷贝麻烦可以使用豌豆荚或者91助手将歌曲文件放入手机SD卡中,在铃声设置那里设置一下在这里就会出现。

1

2

3

4

5

6

7

8

9

10

11

import android.os.Bundle;

import android.preference.PreferenceActivity;

public class RingtoneActivity extends PreferenceActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences

addPreferencesFromResource(R.xml.ringtone);

}

}

5.自定义控件

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#00000000">

<LinearLayout

android:gravity="center_vertical"

android:background="@drawable/preference_mid_background"

android:layout_width="match_parent"

android:layout_height="wrap_content"

>

<ImageView

android:focusable="false"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/setting_about_us">

</ImageView>

<RelativeLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="15dip"

android:layout_marginTop="6dip"

android:layout_marginRight="6dip"

android:layout_marginBottom="6dip"

android:layout_weight="1"

>

<TextView

android:textSize="15dip"

android:textColor="#000000"

android:ellipsize="marquee"

android:id="@+android:id/title"

android:fadingEdge="horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:singleLine="true"

>

</TextView>

<TextView

android:textAppearance="?android:attr/textAppearanceSmall"

android:textColor="#565656"

android:id="@+android:id/summary"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:maxLines="4"

android:layout_below="@+android:id/title"

android:layout_alignLeft="@+android:id/title"

>

</TextView>

</RelativeLayout>

<ImageView

android:focusable="false"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/preference_arrows"/>

</LinearLayout>

</LinearLayout>

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

android:state_facused :为控件选中显示
android:state_pressed:为控件按下显示
最后一个为默认显示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item

android:state_focused="true"

android:drawable="@drawable/preference_mid_pressed"

>

</item>

<item

android:state_pressed="true"

android:drawable="@drawable/preference_mid_pressed"

>

</item>

<item

android:drawable="@drawable/preference_mid"

>

</item>

</selector>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import android.content.Context;

import android.os.Bundle;

import android.preference.Preference;

import android.preference.PreferenceActivity;

import android.preference.Preference.OnPreferenceClickListener;

import android.widget.Toast;

public class AllActivity extends PreferenceActivity

{

/**自定义布局A**/

Preference preference0 = null;

/**自定义布局B**/

Preference preference1 = null;

Context mContext = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences

addPreferencesFromResource(R.xml.all);

mContext = this;

preference0 = findPreference("pref_key_0");

preference0.setOnPreferenceClickListener(new OnPreferenceClickListener()

{

@Override

public boolean onPreferenceClick(Preference preference)

{

Toast.makeText(mContext, "自定义布局A被按下", Toast.LENGTH_LONG).show();

return false;

}

});

preference1 = findPreference("pref_key_1");

preference1.setOnPreferenceClickListener(new OnPreferenceClickListener()

{

@Override

public boolean onPreferenceClick(Preference preference)

{

Toast.makeText(mContext, "自定义布局B被按下", Toast.LENGTH_LONG).show();

return false;

}

});

}

}

读取数据

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

1

2

SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;

boolean something = prefs.getBoolean("something",false);

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

1

2

3

4

5

6

7

8

9

10

11

12

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<string name="ringtone_!">content://media/external/audio/media/1</string>

<string name="ringtone_0">content://media/external/audio/media/1</string>

<string name="list_0">1800000</string>

<string name="edit_1">请输入信息1212</string>

<string name="list">1200000</string>

<string name="ringtone">content://settings/system/ringtone</string>

<boolean name="checkbox_0" value="true" />

<boolean name="checkbox_1" value="true" />

<string name="edit_0">请输入信息</string>

</map>

下载地址:http://vdisk.weibo.com/s/aa3UT

  • 本文固定链接: https://www.xuanyusong.com/archives/155
  • 转载请注明: 雨松MOMO 2012年04月27日 于 雨松MOMO程序研究院 发表

android基础--PreferenceActivity相关推荐

  1. Android基础四大组件详解

    Android四大组件详解 博主接触Android开发将近一年,从最初的JavaSE开始,到Android基础,一直学的糊糊涂涂,最近想整理一番 android基础, 顺便把自己的学习开发经验分享给大 ...

  2. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  3. android intent 源码,Android 基础之 IntentService 源码

    Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...

  4. 【Android基础】动画

    Android里的动画分为两类,以3.0版本为分水岭. 3.0前已存在 帧动画 补间动画 3.0出现 属性动画 帧动画 顾名思义,快速切换几张图片来达到动画的效果. 建立帧动画xml Note:不要把 ...

  5. 基于Android移动终端的微型餐饮管理系统的设计与实现4——Android基础

    本章将介绍一些在开发中用到的一些常用且值得介绍的Android 基础知识和技术,包括Fragment.Slidingmenu.RecyelerView.HelloCharts框架和Ormlite框架. ...

  6. 关于android基础教程一书的初步解读后发现的一些问题

    我是一个比较固执的人..在进行android基础教程一书的初步学习之后,说实话,这本书虽然说为了照顾有需要的童鞋,提供了所有的源代码,就连我也在亲自打了好久的代码之后最后决定放弃,也偷偷懒,进行简单无 ...

  7. Android基础总结+SQlite数据库【申明:来源于网络】

    Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...

  8. Android基础教程pdf

    下载地址:网盘下载 内容简介  · · · · · · <Android基础教程>内容完整丰富,具有较强的通用性,读者都能通过<Android基础教程>快速学习Android开 ...

  9. Android’s PreferenceActivity for all API versions

    官方文档 I have spent the last few days learning about how to use the new Android PreferenceFragment whi ...

  10. Android基础_数据存储

    2019独角兽企业重金招聘Python工程师标准>>> Android基础_数据存储 Android数据存储的几种形式 继承SQLiteOpenHelper public class ...

最新文章

  1. 用imageNamed加载图片产生的问题
  2. Apache认证、授权和访问控制
  3. POJ 2186 popular cow 有向图的强联通问题 Tarjan算法
  4. ABAP_Excel 处理总结(二)
  5. java表数据去重_java8实现列表去重,java8的stream 和lambda的使用实例
  6. 达摩院最新AI技术助力天猫双11,提供接近真人的语音交互体验
  7. 2015-2月的小程序们
  8. 【python】输出到文件, f.write与print
  9. 如何成为信息安全专家
  10. linux卸载alien,Ubuntu/Debian下的安装包装换工具—alien
  11. 安卓背景音乐开关_奢华大屏背景音乐系统-圣巴赫S820,行业典范!
  12. Crossoft Minesweeper Hexagon for Mac
  13. paip.python错误解决2
  14. 博士毕业最高201万!华为顶级薪酬招“天才少年”
  15. 单片机原理及接口技术--01什么是单片机
  16. java jshelllink_Jshell使用
  17. 计算机考证要考PS吗
  18. 面向Java开发者的ChatGPT提示词工程(2)
  19. 微信小程序之swiper无限轮播实现效果
  20. 王国维《人间词话》治学经验三境界

热门文章

  1. 【爬虫专栏11】正则,ajax,json爬马蜂窝
  2. webstorm汉化流程
  3. 《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】
  4. python手册下载_python学习手册
  5. python前端开发工具篇
  6. Streamlit--python中的前端
  7. VB2010(3)整型运算
  8. VB 2010中Excel文件处理的一个奇怪问题
  9. Windows蓝屏分析器WinDbg使用方法
  10. 编程精华资源(ITeye优秀专栏)大汇总