一.基础知识
我们在使用Android手机时,可能会经常用到其中的设置界面,如下所示:
图1 Android系统中的设置界面
而且对于我们自己开发的一个完整的程序来说,我们也会需要给用户提供一个设置界面使用户可以对程序的一些参数进行设置。因此,我们就来学习下如何实现符合我们需要的一个设置界面,及其背后的数据持久化功能。
二.实例开发
2.1 SharedPreferences
在具体介绍Android的设置界面的实现之前,我们先来介绍一下预备知识,就是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的Boolean、Int、Float、Long、String等类型。
android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:
1. public SharedPreferences getPreferences (int mode)
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
2. public SharedPreferences getSharedPreferences (String name, int mode)
因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。
3. public static SharedPreferences getDefaultSharedPreferences (Context context)
PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。
通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。
保存方式如下:
- String STORE_NAME = "Settings";
- SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
- SharedPreferences.Editor editor = settings.edit();
- editor.putInt("sourceType", 0);
- editor.commit();
获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。
读取方式如下:
- SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
- int source = settings.getInt("sorceType", 1);
读取就更加简单了,只要获得SharedPreferences后,就可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。
2.2 PreferenceActivity
上面介绍SharedPreferences键值对保存的基础知识,接着我们就可以来实现Android系统的设置界面。Android系统中和设置界面相关的包为android.preference,其中有一个继承了ListActivity的PreferenceActivity。
下面我们就先实现一个如下图2的最简单的PreferenceActivity设置界面,只有一个CheckBox选择选项,选中时显示“Yes,I love you!”,取消选择时显示“No,I am sorry.”。然后再介绍其具体的实现。
图2 PreferenceActivity界面
首先新建一个工程AndroidPreferenceDemo。
把extends Activity改为extends PreferenceActivity。
在res目录下新建一个xml文件夹,接着在这个文件夹下新建一个取名为preferences.xml的File文件,内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="Settings">
- <CheckBoxPreference
- android:title="Love me?"
- android:summaryOn="Yes,I love you!"
- android:summaryOff="No,I am sorry."
- android:defaultValue="true">
- </CheckBoxPreference>
- </PreferenceScreen>
然后把java文件中的setContentView(R.layout.main);改为
addPreferencesFromResource(R.xml.preferences);
完成了,最后可以运行试下效果。
Java文件的实现很简单,继承PreferenceActivity后,调用其public void addPreferencesFromResource (int preferencesResId)
方法从一个xml文件中获取preference然后显示为标准的设置界面。
因此我们只要在xml文件中布局好要显示的设置界面内容就可以了。
下面我们看下布局文件xml的内容。
对应的xml中可以使用的标签(Tag)可以分为两类,一类是管理布局的显示,如PreferenceScreen;另一类是具体的设置内容,如CheckBoxPreference。
PreferenceScreen可以显示一个完整的页面,可以嵌套,包含在PreferenceScreen标签里的内容都将以一个完整的页面显示。
我们学习一个PreferenceScreen的界面,如下图3所示。
图3 PreferenceScreen相关的布局
当点击左图的选项时,分别会以新的页面显示,如中间和右图所示。
上面页面对应的xml布局文件如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="Settings">
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="Emotions"
- android:summary="settings about emotions">
- <CheckBoxPreference
- android:title="Love me?"
- android:summaryOn="Yes,I love you!"
- android:summaryOff="No,I am sorry."
- android:defaultValue="true">
- </CheckBoxPreference>
- <CheckBoxPreference
- android:title="Hate me?"
- android:summaryOn="Yes,I hate you!"
- android:summaryOff="No,you are a good person."
- android:defaultValue="false">