Android中preference的使用(一)

在Android系统中,当我们点击Menu按钮时,则会弹出Menu的菜单选项,其中一项是设置选项,点击了设置选项后,则会弹出系统的设置 Activity界面,这些设置功能是如何实现的呢?Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理,那么它是怎么保存数据的呢,如何创建PrefenceActivity的呢,更关键是怎样触发相应事件的呢。

Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是 ContentProvider。PreferenceActivity是如何保存的数据,其实就是通过SharedPreference键值对的形式来保存数据的。

下面我们以一个例子来说明如何在Android系统中制作一个设置的功能。先看下该例子的大概框架图:

在src中有两个Activity,其中PreferenceDemo.java是显示Menu页面,MyPreference.java是设置页面;在res/xml目录下有个mypreference.xml的文件,该文件是设置页面的布局文件,在添加该xml文件的时候,注意是选择的不是 Layout,而是Preference,而且注意Folder路径是 res/xml。

下面是各个文件的源代码:

1. mypreference.xml 的源码如下:

[c-sharp] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <PreferenceCategoryandroid:title="我的位置"android:key="set_local">
  5. <CheckBoxPreference
  6. android:key="apply_wifi"
  7. android:title="使用无线网络"
  8. android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
  9. android:defaultValue="true">
  10. </CheckBoxPreference>
  11. <CheckBoxPreference
  12. android:key="apply_gps"
  13. android:title="使用GPS"
  14. android:summary="定位到街道级别(需要消耗更多的电量以及天气允许)">
  15. </CheckBoxPreference>
  16. </PreferenceCategory>
  17. <PreferenceCategoryandroid:title="无线和网络设置">
  18. <CheckBoxPreference
  19. android:key="apply_fly"
  20. android:title="飞行模式"
  21. android:summary="禁用所有无线连接">
  22. </CheckBoxPreference>
  23. <CheckBoxPreference
  24. android:key="apply_internet"
  25. android:title="Internet共享"
  26. android:summary="禁用通过USB共享Internet连接">
  27. </CheckBoxPreference>
  28. <CheckBoxPreference
  29. android:key="apply_wifi"
  30. android:title="Wi-Fi"
  31. android:summary="打开Wi-Fi">
  32. </CheckBoxPreference>
  33. <Preference
  34. android:key="wifi_setting"
  35. android:title="Wi-Fi设置"
  36. android:summary="设置和管理无线接入点"
  37. android:dependency="apply_wifi">
  38. </Preference>
  39. <CheckBoxPreference
  40. android:key="apply_bluetooth"
  41. android:title="蓝牙"
  42. android:summary="启用蓝牙">
  43. </CheckBoxPreference>
  44. <Preference
  45. android:key="bluetooth_setting"
  46. android:title="蓝牙设置"
  47. android:summary="管理连接、设备设备名称和可检测性"
  48. android:dependency="apply_bluetooth">
  49. </Preference>
  50. <EditTextPreference
  51. android:key="number_edit"
  52. android:title="输入电话号码">
  53. </EditTextPreference>
  54. <ListPreference
  55. android:key="depart_value"
  56. android:title="部门设置"
  57. android:dialogTitle="选择部门"
  58. android:entries="@array/department"
  59. android:entryValues="@array/department_value">
  60. </ListPreference>
  61. <RingtonePreference
  62. android:key="ring_key"
  63. android:title="铃声"
  64. android:ringtoneType="all"
  65. android:showDefault="true"
  66. android:showSilent="true">
  67. </RingtonePreference>
  68. </PreferenceCategory>
  69. </PreferenceScreen>

2. MyPreference.java的源码如下:【注:该类继承了PreferenceActivity.java】

[c-sharp] view plain copy
  1. packagecom.andyidea.preference;
  2. importandroid.os.Bundle;
  3. importandroid.preference.PreferenceActivity;
  4. publicclassMyPreferenceextendsPreferenceActivity{
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. addPreferencesFromResource(R.xml.mypreference);
  9. }
  10. }

3. PreferenceDemo.java的源码如下:

[c-sharp] view plain copy
  1. packagecom.andyidea.preference;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.Menu;
  6. importandroid.view.MenuItem;
  7. publicclassPreferenceDemoextendsActivity{
  8. publicstaticfinalintSET=Menu.FIRST;
  9. publicstaticfinalintEXIT=Menu.FIRST+1;
  10. @Override
  11. publicvoidonCreate(BundlesavedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. }
  15. //创建Menu菜单
  16. @Override
  17. publicbooleanonCreateOptionsMenu(Menumenu){
  18. menu.add(0,SET,0,"设置");
  19. menu.add(0,EXIT,0,"退出");
  20. returnsuper.onCreateOptionsMenu(menu);
  21. }
  22. //点击Menu菜单选项响应事件
  23. @Override
  24. publicbooleanonOptionsItemSelected(MenuItemitem){
  25. switch(item.getItemId()){
  26. case1:
  27. IntentmIntent=newIntent();
  28. mIntent.setClass(this,MyPreference.class);
  29. startActivity(mIntent);
  30. break;
  31. case2:
  32. finish();
  33. break;
  34. }
  35. returnsuper.onOptionsItemSelected(item);
  36. }
  37. }

4. array.xml 源码:

[c-sharp] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <string-arrayname="department">
  4. <item>综合部</item>
  5. <item>外贸部</item>
  6. <item>行政部</item>
  7. </string-array>
  8. <string-arrayname="department_value">
  9. <item>001</item>
  10. <item>002</item>
  11. <item>003</item>
  12. </string-array>
  13. </resources>

同时我们也别忘了在 AndroidManifest.xml中对MyPreference.java进行注册。即在 AndroidManifest.xml中的application节点添加:<activity android:name=".MyPreference"/> 。

下面我们来看下运行的结果:

1. 设置Menu的主界面

2. 设置功能界面

呵呵,上面就是运行显示设置功能界面的结果。该设置功能的界面设置各个参数请看 Android中preference的使用(二) 文章的说明。

Android中preference的使用(二)

继上篇文章 Android中preference的使用(一) ,在这篇文章中主要是学习下preference中各个节点的属性。PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到以下几项:

1. CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:

2. EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。如图:

3. ListPreference: 列表选择,弹出对话框供选择。如图:

4. Preference:只进行文本显示,需要与其他进行组合使用。

5. PreferenceCategory:用于分组。效果如下:

6. PreferenceScreen:PreferenceActivity的根元素。

7. RingtonePreference:系统玲声选择。

下面我们来分析各个节点的属性:

PreferenceCategory属性分析:

title:显示的标题

key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 (以下相同)

CheckBoxPreference属性分析:

Key:唯一标识

title:显示标题(大字体显示)

summary:副标题(小字体显示)

defaultValue:默认值(当然,此处只能是true或false了)

Preference属性分析: Key:唯一标识.

title:显示标题(大字体显示)

summary:副标题(小字体显示)

dependency:附属(嘛意思),即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。上面代码中的Preference元素附属于key等于“apply_bluetooth”的CheckPreference元素,当CheckPreference值为true时,Preference则为可用,否则为不可用。

EditTextPreperence属性分析

Key:唯一标识.

title:显示标题(大字体显示)

ListPreference属性分析:

Key:唯一标识.

title:显示标题(大字体显示)

dialogTitle:弹出对话框的标题

entries:列表中显示的值。为一个数组,通读通过资源文件进行设置。

entryValues:列表中实际保存的值,也entries对应。为一个数组,通读通过资源文件进行设置。以下代码显示的是arrays.xml文件中内容:

[c-sharp] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <string-arrayname="department">
  4. <item>综合部</item>
  5. <item>外贸部</item>
  6. <item>行政部</item>
  7. </string-array>
  8. <string-arrayname="department_value">
  9. <item>001</item>
  10. <item>002</item>
  11. <item>003</item>
  12. </string-array>
  13. </resources>

RingtonePreference 属性分析

铃声(暂时没有用到过),暂时略过。

如何响应PreferenceActivity的操作

只要重写PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通过参数preference来判断是对那一个元素进行的,并根据需要进行操作。代码如下:

[c-sharp] view plain copy
  1. @Override
  2. publicbooleanonPreferenceTreeClick(PreferenceScreenpreferenceScreen,
  3. Preferencepreference){
  4. //TODOAuto-generatedmethodstub
  5. returnsuper.onPreferenceTreeClick(preferenceScreen,preference);
  6. }

这样到此为止,我们在APP中就实现了设置功能。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 【Android】_音乐列表_仿网易云音乐播放器2(读取本地mp3)
  6. 手把手教你在CTS中编写自己的测试模块
  7. 为Android添加底层核心服务
  8. Android(安卓)Studio中NDK的配置
  9. 在BeagleBoard XM 开发板上运行Android

随机推荐

  1. 最近学的css技术点总结
  2. 备一下 2020 年学习 Java 的 40 本书
  3. 优化博客页面访问速度
  4. ThreadLocal就是这么简单
  5. 迁到HTTPS这么麻烦,为什么还要折腾?
  6. 科班出生与自学的程序员,哪个强?
  7. 帆软报表自定义函数-取json数据
  8. 理想中的职业自由,却不那么理想
  9. Python之父-Guido van Rossum
  10. 不会CSS的痛