在Android系统中,当我们点击Menu按钮时,则会弹出Menu的菜单选项,其中一项是设置选项,点击了设置选项后,则会弹出系统的设置 Activity界面,这些设置功能是如何实现的呢?Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理,那么它是怎么保存数据的呢,如何创建PrefenceActivity的呢,更关键是怎样触发相应事件的呢。
Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是 ContentProvider。PreferenceActivity是如何保存的数据,其实就是通过SharedPreference键值对的形式来保存数据的。
下面我们以一个例子来说明如何在Android系统中制作一个设置的功能。先看下该例子的大概框架图:
![](http://static.oschina.net/uploads/img/201111/14142333_a4MA.gif)
在src中有两个Activity,其中PreferenceDemo.java是显示Menu页面,MyPreference.java是设置页面;在res/xml目录下有个mypreference.xml的文件,该文件是设置页面的布局文件,在添加该xml文件的时候,注意是选择的不是 Layout,而是Preference,而且注意Folder路径是 res/xml。
下面是各个文件的源代码:
1. mypreference.xml 的源码如下:
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
03 | xmlns:android = "http://schemas.android.com/apk/res/android" > |
04 | < PreferenceCategory android:title = "我的位置" android:key = "set_local" > |
06 | android:key = "apply_wifi" |
07 | android:title = "使用无线网络" |
08 | android:summary = "使用无线网络在应用程序(例如Google地图)中查看位置" |
09 | android:defaultValue = "true" > |
12 | android:key = "apply_gps" |
14 | android:summary = "定位到街道级别(需要消耗更多的电量以及天气允许)" > |
18 | < PreferenceCategory android:title = "无线和网络设置" > |
20 | android:key = "apply_fly" |
22 | android:summary = "禁用所有无线连接" > |
25 | android:key = "apply_internet" |
26 | android:title = "Internet共享" |
27 | android:summary = "禁用通过USB共享Internet连接" > |
30 | android:key = "apply_wifi" |
32 | android:summary = "打开Wi-Fi" > |
35 | android:key = "wifi_setting" |
36 | android:title = "Wi-Fi设置" |
37 | android:summary = "设置和管理无线接入点" |
38 | android:dependency = "apply_wifi" > |
41 | android:key = "apply_bluetooth" |
43 | android:summary = "启用蓝牙" > |
46 | android:key = "bluetooth_setting" |
48 | android:summary = "管理连接、设备设备名称和可检测性" |
49 | android:dependency = "apply_bluetooth" > |
52 | android:key = "number_edit" |
53 | android:title = "输入电话号码" > |
56 | android:key = "depart_value" |
58 | android:dialogTitle = "选择部门" |
59 | android:entries = "@array/department" |
60 | android:entryValues = "@array/department_value" > |
63 | android:key = "ring_key" |
65 | android:ringtoneType = "all" |
66 | android:showDefault = "true" |
67 | android:showSilent = "true" > |
2. MyPreference.java的源码如下:【注:该类继承了PreferenceActivity.java】
01 | package com.andyidea.preference; |
03 | import android.os.Bundle; |
04 | import android.preference.PreferenceActivity; |
06 | public class MyPreference extends PreferenceActivity { |
09 | public void onCreate(Bundle savedInstanceState) { |
10 | super .onCreate(savedInstanceState); |
11 | addPreferencesFromResource(R.xml.mypreference); |
3. PreferenceDemo.java的源码如下:
01 | package com.andyidea.preference; |
03 | import android.app.Activity; |
04 | import android.content.Intent; |
05 | import android.os.Bundle; |
06 | import android.view.Menu; |
07 | import android.view.MenuItem; |
09 | public class PreferenceDemo extends Activity { |
11 | public static final int SET = Menu.FIRST; |
12 | public static final int EXIT = Menu.FIRST+ 1 ; |
15 | public void onCreate(Bundle savedInstanceState) { |
16 | super .onCreate(savedInstanceState); |
17 | setContentView(R.layout.main); |
22 | public boolean onCreateOptionsMenu(Menu menu) { |
23 | menu.add( 0 ,SET, 0 , "设置" ); |
24 | menu.add( 0 ,EXIT, 0 , "退出" ); |
25 | return super .onCreateOptionsMenu(menu); |
30 | public boolean onOptionsItemSelected(MenuItem item) { |
31 | switch (item.getItemId()){ |
33 | Intent mIntent = new Intent(); |
34 | mIntent.setClass( this , MyPreference. class ); |
35 | startActivity(mIntent); |
41 | return super .onOptionsItemSelected(item); |
4. array.xml 源码:
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
03 | < string-array name = "department" > |
08 | < string-array name = "department_value" > |
同时我们也别忘了在 AndroidManifest.xml中对MyPreference.java进行注册。即在 AndroidManifest.xml中的application节点添加:<activity android:name=".MyPreference"/> 。
下面我们来看下运行的结果:
1. 设置Menu的主界面
![](https://i-blog.csdnimg.cn/blog_migrate/13b63a4aa02c9ae46c82f5758a5ed673.gif)
2. 设置功能界面
![](https://i-blog.csdnimg.cn/blog_migrate/aeaee630dc622d6e58b6c39dd52da216.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/5ca7071af7d3bd97ed92d55235031a38.gif)
呵呵,上面就是运行显示设置功能界面的结果。该设置功能的界面设置各个参数请看 Android中preference的使用(二) 文章的说明。