介绍
代表着一种基本的Preference的UI构件
当指定使用XML的层次架构的时候,每一个元素都是preference的子类,跟视图的层次跟布局类似
这个类中包含一个Key值,这个key值跟SharedPreference的存储键有关系(自己能够储存用户的行为偏好)
Android系统会将Preference元素的值存储在sharedPreference文件中。该文件存放路径位于
DDMS视图下的data/data/[packgename]/shared_prefs/文件下,命名约定为:packagename_preferencse.xml。
在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建
应用程序时使用的View布局结构。这种布局的好处是:布局界面的可控性和高效率以及可存储值的简洁性
家庭元素介绍
单一元素:
Preference 文本框
CheckPreference 单选框
EditTextPreference 输入框
ListPreference 列表框
RingtonePreference 铃声
组合控件:
PreferenceCategory :类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局更具备层次感 。
PreferenceScreen : 所有Preference元素的根节点。
Preferenece XML
在res/xml/下加入我们的preference XML文件
例子:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:widgetLayout="@layout/my_checkbox"
android:defaultValue="false"
android:key="boolean_value"
android:summary="保存一个boolean值"
android:title="Checkbox" />
<EditTextPreference
android:key="My_Eidt"
android:summary="这是输入框"
android:title="你看着办啊"/>
<Preference
android:key="text"
android:summary="文本"
android:title="我是文本"/>
</PreferenceScreen>
属性值:
android:key:key:唯一标识,SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 。
android:defaultValue:默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态。
android:enabled :表示该Preference是否可用状态。
android:title :每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary :每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)
android:persistent:表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;
否则,则表示不写入该Preference元素的值。
android:layout:在一个preferenceactivity的偏好布局 用于填充view
android:dependency:表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。B可用,则A可用;
B不可用,则A不可用。
android:icon: 偏好图标对于偏好选择图标必须是一个引用到另一个资源的形式或以packagetypename 主题属性.
android:disableDependentsState:与android:dependency相反。B可用,则A不可用;B不可用,则A可用。
android:order:表示偏好顺序,对于偏好较低的值的顺序是先点如果不指定默认的排序将字母必须是一个整数,如100,
这也可能是一个参考值在含有这类这相当于全局属性资源符号秩序的形式或 形式packagetypename主题属性的一个资源。
android:shouldDisableView:是否被禁用,这种偏好是必须是布尔值true或false 这也可能是一个参考的形式或主题属性
packagetypename资源,packagetypename形式包含一个值 相当于全局属性资源符号shoulddisableview相关方法
android:selectable:偏好是否是可选的。
android:widgetLayout:可以做小部部件部分的布局。
android:fragment: 使用时,可以碎片化PreferenceActivity。
代码实现
Android 3.0以下版本,必须让Activity继承PreferenceActivity类来构建。 高于或等于android 3.0版本 使用PreferenceFragment。
然后在onCreate()方法中通过addPreferencesFromResource(R.xml.custom_preference) (我们自定义的Preference 布局)。
获取preferences:(里面传入的是我们在xml里面定义的key)
Preference wechatPref = findPreference(Config.KEY_ENABLE_WECHAT);
Preference的跳转:
第一种方法:可以在xml文件中配置
<Preference
android:key="wifi_setting"
android:summary="设置和管理无线接入点"
android:title="Wi-Fi设置">
<!-- 点击时 自定义一个默认跳转Intent action指定隐式Intent -->
<!-- action指定隐式Intent ; targetPackage和targetClass指定显示Intent-->
<intent
android:action="com.example.action.seemAction"
android:targetClass="com.example.mypreference.MainActivity"
android:targetPackage="com.example.mypreference" />
</Preference>
第二种方法:
就是在监听事件里面正常跳转就可以了
Preferenece数据的操作:
SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
可以通过remove()清除某个名字的prefernece,
clear()清除所有的preferences。
我们可以通过edit()获取preferences的editor,进而进行编辑,修改后,通过commit()将修改值保存。
监听事件:
public booleanonPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference)
说 明 : 当Preference控件被点击时,触发该方法。
参数说明: preference 点击的对象。
返回值: true 代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。 例如,不跳转至默认Intent。
false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。
Preference.OnPreferenceChangeListener 该监听器的一个重要方法如下:
boolean onPreferenceChange(Preference preference,Object objValue)
说明: 当Preference的元素值发送改变时,触发该事件。
返回值:true 代表将新值写入sharedPreference文件中。
false 则不将新值写入sharedPreference文件
Preference.OnPreferenceClickListener 该监听器的一个重要方法如下:
public booleanonPreferenceClick(Preference preference)
说明:当点击控件时触发发生,可以做相应操作。
那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,
它的触发规则如下:
1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;
如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。