原文链接: http://developer.android.com/guide/topics/ui/settings.html
设置
应用程序通常包括允许用户修改app属性和行为的设置。比如说,一些app允许用户指定通知消息是否有效或者指定应用程序和云端同步数据的频率。
如果你想为你的app提供设置,你应该使用android的Preference API去建立一个和其他app一样用户体验的界面。这个文档描述了如何通过Preference API建立你的app设置。
如果你想为你的app提供设置,你应该使用android的Preference API去建立一个和其他app一样用户体验的界面。这个文档描述了如何通过Preference API建立你的app设置。
在这个文档中:
2.1创建设置组
3.创建一个Preference Activity
6.1创建headers文件
8.管理流量使用
9.1指定用户界面
关键的类:1.Preference 2.PreferenceActivity 3.PreferenceFragment
1概述
1.1Preferences
2.XML中定义Preferences
2.1创建设置组
2.2使用意图intents
3.创建一个Preference Activity
4.使用Preferece Fragements
5.设置默认值
6使用Preference Headers
6.1创建headers文件
6.2显示headers
6.3使用preference headers支持旧版本
7.读取Preferences值
7.1监听preference值的变化
8.管理流量使用
9.创建自定义的Preference
9.1指定用户界面
9.2保存设置值
9.3初始化当前值
9.4提供一个默认值
9.5保存和恢复Preference的状态
关键的类:1.Preference 2.PreferenceActivity 3.PreferenceFragment
1概述
提供使用声明在XML文件中的多个Preference的子类创建设置的用户界面,而不是使用View对象。
一个Preference对象是一个设置界面的基石。每一个Preference以一个list item项出现,并且为用户提供合适的UI界面去更改设置。比如说,一个CheckBoxPreference是一个显示checkBox的list item项,一个ListPreference创建一个item,打开后是一系列选择的对话框。
每一个你添加的Preference都有对应的键-值对,系统在sharedPreference中用来保存设置的值。当用户改变了设置,系统会更新在sharePreferences文件中相对应的值。只有当你需要基于用户设置决定app的行为时,你才需要直接和sharePreferences文件交互读取设置值。
每一个存储在sharePreferences中的设置值将会是以下几种数据类型:
Boolean布尔值,Float浮点数,Int整数型,Long长整数,String字符串,String set.
因为你的app设置的UI是通过Preference对象而不是View对象,你需要使用特殊的Activity和Fragment子类去显示这些list列表设置。
a.如果你的app支持旧于android 3.0版本,你需要使用继承PreferenceActivity的activity。
b.如果在android 3.0版本或以上,你可以使用包含PreferenceFragment的传统Activity去显示你的app设置。当然,当你需要多组的设置时,你同样可以使用PreferenceActivity去为大屏幕创建的类似平板的布局。
如何创建你的PreferenceActivity和PreferenceFragment实例,是在章节3(创建一个Preference Activity)和章节4(使用Preferece Fragements)中讨论。
一个Preference对象是一个设置界面的基石。每一个Preference以一个list item项出现,并且为用户提供合适的UI界面去更改设置。比如说,一个CheckBoxPreference是一个显示checkBox的list item项,一个ListPreference创建一个item,打开后是一系列选择的对话框。
每一个你添加的Preference都有对应的键-值对,系统在sharedPreference中用来保存设置的值。当用户改变了设置,系统会更新在sharePreferences文件中相对应的值。只有当你需要基于用户设置决定app的行为时,你才需要直接和sharePreferences文件交互读取设置值。
每一个存储在sharePreferences中的设置值将会是以下几种数据类型:
Boolean布尔值,Float浮点数,Int整数型,Long长整数,String字符串,String set.
因为你的app设置的UI是通过Preference对象而不是View对象,你需要使用特殊的Activity和Fragment子类去显示这些list列表设置。
a.如果你的app支持旧于android 3.0版本,你需要使用继承PreferenceActivity的activity。
b.如果在android 3.0版本或以上,你可以使用包含PreferenceFragment的传统Activity去显示你的app设置。当然,当你需要多组的设置时,你同样可以使用PreferenceActivity去为大屏幕创建的类似平板的布局。
如何创建你的PreferenceActivity和PreferenceFragment实例,是在章节3(创建一个Preference Activity)和章节4(使用Preferece Fragements)中讨论。
1.1Preferences
App的每一个设置都是通过Preference的特定子类展现。每一个子类包含了一系列允许你去指定的核心属性,比如说设置的标题和默认值。每一个子类同时提供了它的特殊特性和用户界面。比如说,图一显示了短消息app的设置界面截图。设置屏幕的每一个list item列表项,都是通过不同的Preference对象支持的。
图一.截图来自android短信app的设置界面截图。选择一个Preference定义的item,打开一个更改设置的界面。
一些常用的Preference:
CheckBoxPreference
显示一个带有checkBox的item,可以enable或者disable。存储的是布尔值。(选中则是true)ListPreference
打开一个包含一列radio button的对话框。存储的可以是支持的数据类型(列表中)的任意一种。EditTextPreference
打开一个包含editText组件的对话框。存储的是String字符串。
当然,内置的类不可能满足所有需求,并且你的app可能需要一些特殊的电信。比如说,现在的平台并没有提供一个数字/日期选择的Preference。所以你可能需要定义自己的Preference子类。为了帮助你,查看章节9(创建自定义的Preference)。
2.XML中定义Preferences
虽然在运行的时候可以初始化新的Preference对象,但是你应该通过Preference层级在xml定义你的设置列表项。通过XML文件去定义你的一系列设置是首选的方案,因为xml文件提供一个简单阅读和容易更新的结构。同时,虽然你可以在运行期间更改设置,但你的app设置通常是提前决定的。
每一个Preference子类可以通过匹配类名的xml元素被声明,比如说<CheckBoxPreference>.
你需要在res/xml/目录中存储XML文件。虽然你可以给文件任意命名,但是通常命名为preferences.xml。你通常只需要一个文件,因为层级中的分支会使用嵌套的PreferenceScreen实例声明。
XML文件的根节点一定是<PreferenceScreen>元素。在这个元素里面,你添加Preference。所有你添加在<PreferenceScreen>元素里的孩节点,都会显示为设置列表中的一个单独item。
举例:
每一个Preference子类可以通过匹配类名的xml元素被声明,比如说<CheckBoxPreference>.
你需要在res/xml/目录中存储XML文件。虽然你可以给文件任意命名,但是通常命名为preferences.xml。你通常只需要一个文件,因为层级中的分支会使用嵌套的PreferenceScreen实例声明。
XML文件的根节点一定是<PreferenceScreen>元素。在这个元素里面,你添加Preference。所有你添加在<PreferenceScreen>元素里的孩节点,都会显示为设置列表中的一个单独item。
举例:
在这个例子中,有一个CheckBoxPreference和一个ListPreference。每一个item都包含了下面三个属性:
android:key
这个属性要求Preferences保持数据值。它指定了一个唯一的键值,系统用它在sharedPreferences保存设置值。只有当Preference是PreferenceCategory或者PreferenceScreen,或者Preference指定了一个可以唤醒的意图intent或一个可以显示的fragment时,这个属性值才不会要求。
android:title
提供一个用户可见的设置名。android:defaultValue
这个指定了系统在sharedPreferences文件中应该设置的初始化的值。你可以为所有设置提供默认值。如果你的设置列表超过10个item,你可能希望为设置分组并添加标题,或者在不同屏幕上显示这些组。在接下来的内容会介绍这些选择。
2.1创建设置组
如果你要展示一个超过10个item的设置项,用户可能很难去寻找、理解和操作它们。你可以通过分组来补救,有效把一个很长的列表转换为多个短的列表。一个分组可以通过以下俩种方法进行展示:
1.使用标题 2.使用子屏幕
你可以使用分组技术中的一个或者俩个去组织你的app设置。当你决定使用哪一个和如何划分设置时,你需要遵循android设计中设置指导文档的指南。
1.使用标题 2.使用子屏幕
你可以使用分组技术中的一个或者俩个去组织你的app设置。当你决定使用哪一个和如何划分设置时,你需要遵循android设计中设置指导文档的指南。
使用标题
如果你想通过在设置组之间的标题进行分隔(如图2所示),在每一个PreferenceCategory里面摆放每一组Preference对象。
图2.有标题的设置种类
1.通过<PreferenceCategory>元素指定的种类
2.通过android:title属性指定title
1.通过<PreferenceCategory>元素指定的种类
2.通过android:title属性指定title
举一个列子:
使用子屏幕
如果你想将一组设置放在子屏幕中(如图3所示),将那一组的Preference对象放在PreferenceScreen中。
图3.设置的子屏幕。<PreferenceScreen>元素创建这样子的item,当选中该item,会打开一个分离的列表去显示嵌套的设置。
举一个例子:
2.2使用意图intents
在某些情况下,你可能想使用Preference item条目去打开一个不同的activity,而不是一个设置屏幕,比如网页浏览器。当用户选择一个Preference item条目时,为了唤醒一个intent,可以在对应的<Preference>元素中添加一个子元素<intent>。
举一个例子,这个就是如何通过Preference item条目打开一个网页。
举一个例子,这个就是如何通过Preference item条目打开一个网页。
你可以通过下面的属性使用显式和隐式的意图intents.
android:action
按照setAction() 方法分配actionandroid:data
按照setData() 方法分配dataandroid:mimeType
按照setType()方法分配MIME typeandroid:targetClass
按照setComponent()方法,组件名称的类部分android:targetPackage
按照setComponent()方法,组件名称的包部分3.创建一个Preference Activity
为了在activity中显示你的设置,需要继承PreferenceActivity类。为了显示一系列基于Preference对象层级的设置,这是传统Activity类的继承。当用户更改设置时,PreferenceActivity会自动保持跟每个Preference相关的设置。
注意:如果你在高于android3.0的系统上开发app,你应该使用PreferenceFragement。下一部分将会介绍它。
需要记住的是,你不应该在onCreate()回调方法中下载view组件的布局。而是应该使用addPreferenceFromResource()方法去添加你已经在xml文件中声明的Preferences到Activity中。举一个例子,对于PreferenceActivity而言,这是一个最基本的代码要求:
注意:如果你在高于android3.0的系统上开发app,你应该使用PreferenceFragement。下一部分将会介绍它。
需要记住的是,你不应该在onCreate()回调方法中下载view组件的布局。而是应该使用addPreferenceFromResource()方法去添加你已经在xml文件中声明的Preferences到Activity中。举一个例子,对于PreferenceActivity而言,这是一个最基本的代码要求:
对于某些app而言,这就够了,因为一旦用户更改了Preference,系统会存储这些变化到默认的sharedPreferences文件中,当你需要检查用户设置时,其他app组件也可以读取这些值。在大部分app中,为了监听Preferencesd的变化需要更多的代码。为了更多的在sharedPreferences文件中监听变化的信息,查看章节7(读取Preferences值)。
4.使用Preferece Fragements
如果你在高于android 3.0的系统上开发,你应该使用PreferenceFragment去显示一系列的Preference对象。你可以添加PreferenceFragment到任何activity – 而不需要使用PreferenceActivity。相比于单独使用activity,Fragments为你的app提供更加灵活的架构,不论你使用哪一种activity。同样的,如果可能的话,我们建议你应该使用PreferenceFragment去控制设置的显示而不是使用PreferenceActivity。
PreferenceFragment的实现非常简单,在onCreate()方法里通过addPreferenceFromResource()方法下载Preference文件。举例:
你可以添加这个Fragement到一个Activity中,就好像其他Fragment一样。
注意:一个PreferenceFragment是没有它自己的Context对象。如果你需要Context对象,你应该调用getActivity()方法。然后,只有当Fragement attached到activity的时候,才能调用getActivity()方法。当一个Fragement还没有attached到activity的时候,或者已经detached的时候,getActivity()返回为null.
5.设置默认值
你创建的Preference很有可能定义了某些你app中非常重要的行为,所以当用户打开你的app时,非常有必要为每一个Preference初始化它的默认值。你需要做的第一件事就是在XML文件中通过android:defaultValue这个属性去为每一个Preference指定默认值。这个值可以是和Preference对象匹配的任何数据类型。举一个列子:
然后,在应用程序的主activity或者在任何用户可能第一次进入你的应用程序的activity中的onCreate()方法里,调用setDefaultValues():
在onCreate()方法里面调用这个方法,是为了确保你的应用程序适当的初始化默认设置,因为你的应用程序为了决定某些行为(比如在蜂窝网络时是否下载数据)可能会需要读取设置值。
setDefaultValues()这个方法有三个参数:
一旦你设置了第三个参数为false,每当你的activity启动时,你都可以安全的调用setDefaultValues()方法,即使重置它们为默认值也不会覆盖用户保存的preferences值。然而,如果你设为true,你会用默认值覆盖之前任意的修改。
setDefaultValues()这个方法有三个参数:
a.你应用程序的上下文Context。
b.Preference XML文件中的资源ID,即你希望设置的那个值。
c.一个布尔值表示该默认值是否设置次数超过一次。
如果是false,系统只有当这个方法在过去从来没有被调用(或者在shared Preferences文件中的属性“KEY_HASE_SET_DEFAULT_VALUES”是false)时设置初始值。一旦你设置了第三个参数为false,每当你的activity启动时,你都可以安全的调用setDefaultValues()方法,即使重置它们为默认值也不会覆盖用户保存的preferences值。然而,如果你设为true,你会用默认值覆盖之前任意的修改。