Android中设置功能的实现

前言

  在 Android 应用开发过程,多多少少会碰到应用设置的问题,一开始的想法肯定是使用 view 对象构建用户界面,但是 Google 表示这种做法太不友好,应当使用 Android 的 Preference API 构建一个与其他 Android 应用中的用户体验一致的界面(包括系统设置)。

布局视图

  官方说法是定义首选项,我觉得说成布局设置界面视图更合适。

  按照官方指导,首先需要在 res/xml 目录下定义一个 xml 文件,通常命名为 preferences.xml(可以更改命名)。XML 文件的根节点必须是一个 <PreferenceScreen> 元素,可以在此元素内添加每个 <Preference>

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
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:defaultValue="true"
android:key="checkbox"
android:title="checkbox" />
<PreferenceScreen
android:key="scree"
android:title="screen"
android:persistent="false">
<SwitchPreference
android:key="switch"
android:title="switch" />
<ListPreference
android:defaultValue="1"
android:entries="@array/str_arr"
android:entryValues="@array/str_arr"
android:key="list"
android:title="list" />
</PreferenceScreen>
<PreferenceCategory
android:key="category"
android:title="category">
<EditTextPreference
android:key="edit"
android:title="edit" />
<MultiSelectListPreference
android:key="multi"
android:title="multi"
android:entries="@array/str_arr"
android:entryValues="@array/str_arr"/>
</PreferenceCategory>
<Preference android:title="preference" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</Preference>
</PreferenceScreen>

这些元素有不同的属性,其中以下三个属性是通用的:

  • android:key

    对于要保留数据值的首选项,必须拥有此属性。它指定系统在将此设置的值保存在 SharedPreferences 中时所用的唯一键(字符串)。不需要此属性的仅有情形是:首选项是 PreferenceCategory 或PreferenceScreen,或者首选项指定要调用的 Intent(使用 <intent> 元素)或要显示的 Fragment(使用 android:fragment 属性)。

  • android:title

    此属性为设置提供用户可见的名称。

  • android:defaultValue

    此属性指定系统应该在 SharedPreferences 文件中设置的初始值。您应该为所有设置提供默认值。

  当设置的选项过多时,为了方便用户查看,我们一般会对选项进行分组。分组的形式一般分为两种,一种是使用标题,一种是使用子屏幕(即打开一个新的界面)

  • 使用标题

    利用<PreferenceCategory>标签可以实现如图的效果:

  • 使用子屏幕

    利用<PreferenceScreen>标签可以实现如图效果:

具体实现代码见上方代码块

值的获取

想要获取设置项的值,可以通过以下代码实现:

1
2
3
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
//T t = pref.getXXX(key, defaultValue);
String str = pref.getString("edit", "");

同时,可以实时监控设置项值的变化,利用以下代码:

首先继承OnSharedPreferenceChangeListener接口,在onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)实现当值发生变化时需要做的操作

1
2
3
4
5
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.i("===========>>>>>>", key);
Log.i("===========>>>>>>", (findPreference(key) instanceof CheckBoxPreference) + "");
}

可能会用到的方法

  • 实现设置项各个点击事件

    findPreference(key).setOnPreferenceClickListener(……);

    或者

    实现接口OnPreferenceClickListener

备注

  • 如果想要实现Material Design风格的设置界面,可以参考此博客
  • 其他用法参考官方指导文档 (需要科学上网)