java.lang.Object
↳ java.util.prefs.Preferences
目前在Android系统源码中,Setting模块中使用的就是Preference布局,而不是常用的View布局结构。现在我们来学习Preference在布局中的应用。
Preference 控件
它的应用效果与TextView 有点相似。但是使用方法却完全不同。
1.加载Preference布局:
首先要使我们自定义的类去继承PreferenceActivity或PreferenceFragment(建议),然后在onCreate()方法中调用
addPreferencesFromResource(R.xml.mypreferences);
注意:mypreferences是我们自定的Preference布局,
在res/xml/mypreferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<Preference
android:key="preference"
android:summary="123"
android:title="preference" >
</Preference>
</PreferenceScreen>
2.Preference属性说明:
android:key 每个Preference控件唯一标识,通过它找到对应的Preference,相当于View中的“id”
android:defaultValue 默认值。例如,CheckBoxPreference 默认值可选“true”,表示默认选中状态;
EditTextPreference 默认值写“110”,弹出的edit框中默认值为“110”
android:enabled 表示该Preference控件是否可用状态
android:title 表示该Preference显示的大标题
android:summary 表示该Preference显示的小标题
android:persistent 表示Preference所对应的值是否写入sharedPreference的文件中,true表示写入,false表示不写入
android:dependency 表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。
B可用,
则A可用;B不可用,则A不可用。写入的值为其他preference的key
3.Preference的跳转
在Preference布局中存在两种方法进行跳转:
A:在配置每个Preference控件的属性时,我们可以设置点击它时跳转的Intent。在xml中配置如下:
<Preference
android:key="preference"
android:summary="小标题"
android:title="大标题" >
<intent
android:targetClass="com.example.swiperefreshlayoutdemo.MainActivity"
android:targetPackage="com.example.swiperefreshlayoutdemo" >
</intent>
</Preference>
B:在方法onPreferenceTreeClick(),创建新的跳转Intent;
注意:当上述两种方式同时存在时,则看onPreferenceTreeClick()的返回值,如果为true,表示消费该事件使用onPreferenceTreeClick()中的,如果为false时,表示不消费该事件,使用xml中配置的intent。
1:重写父类方法onPreferenceTreeClick(),点击时执行该方法。
2:注册监听事件setOnPreferenceClickListener(),重写onPreferenceClick(),点击时执行该方法;
当onPreferenceClick()返回为false,那么会先执行onPreferenceClick(),后执行onPreferenceTreeClick().
当onPreferenceClick()返回为true,表示消费该事件,只会执行onPreferenceClick();
注册监听事件setOnPreferenceChangeListener(),重写onPreferenceChange().
当Preference的元素值发生改变时,执行该方法。当返回为false时,则不将新值写入sharedPreference文件,返回为true时,将新值写入sharedPreference文件中。
补充:点击某个Preference控件后,会先回调onPreferenceChange()方法,即是否保存值,然后再回调onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我们得到的控件值就是最新的Preference控件值。
// 得到存储在Preferences值的对象,然后对其进行相应操作
SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);
boolean apply_wifiChecked = shp.getBoolean("apply_wifi", false);