最近编辑于2018年4月30日
一、引入Preference的方式
1、Preference有两种界面展现形式:PreferenceActivity和PreferenceFragment。
2、可以在PreferenceActivity或PreferenceFragment中以两种方式引入Preference:
i、addPreferencesFromResource(R.xml.preference_xxx);其中preference_xxx是res下xml文件夹下的一种特定格式的XML文件;
ii、setPreferenceScreen(preferenceScreen);详情可以参见API Demos中PreferencesFromCode类,可以对比下面说到的PreferenceScreen的XML文件。
二、引用的XML的节点形式
1、根结点必须是PreferenceScreen,而PreferenceScreen也可以作为子节点的一般父节点,还可以设置android:fragment属性引入fragment(该fragment可以再展示Preference);
2、PreferenceCategory也可以作为父节点,同时其有一个android:title属性;
3、子节点通常有CheckBoxPreference、SwitchPreference、EditTextPreference、ListPreference、自定义Preference。
三、节点的样式
1、PreferenceScreen就是一个空的容器;
2、PreferenceCategory是一个附带标题(TextView,默认颜色colorAccent)的容器,即使不设置android:title属性也会留出标题的空间;
3、CheckBoxPreference左上一个标题(android:title属性,TextView,默认颜色深黑色),左下一个描述(android:summary属性,TextView,默认颜色浅灰色),右边一个CheckBox控件。
4、SwitchPreference左上一个标题(android:title属性,TextView,默认颜色深黑色),左下一个描述(android:summary属性,TextView,默认颜色浅灰色),右边一个Switch控件。
5、EditTextPreference是一个DialogPreference,除了左上一个标题(android:title属性,TextView,默认颜色深黑色),左下一个描述(android:summary属性,TextView,默认颜色浅灰色),点击它时还会弹起一个dialog,这个dialog有一个标题(android:dialogTitle属性)一个EditText还有取消按钮确定按钮。
6、ListPreference也是一个DialogPreference,除了左上一个标题(android:title属性,TextView,默认颜色深黑色),左下一个描述(android:summary属性,TextView,默认颜色浅灰色),点击它时还会弹起一个dialog,这个dialog有一个标题(android:dialogTitle属性),还有一个单选列表(android:entries属性表示每个选项展示的文字,android:entryValues属性表示每个选项存储的值)。
四、Preference的作用
用户操作这些控件时实际上就是操作SharePreference,会将android:key属性的值作为key存储一些值。CheckBoxPreference和SwitchPreference都继承自TwoStatePreference,在setChecked时会调用父类的persistBoolean方法,而在persistBoolean方法中进行editor.putBoolean(mKey, value);操作,所以最终保存的是boolean值。
而EditTextPreference保存的EditText中输入的String值,ListPreference则保存的是android:entryValues属性数组中选中的String值。
五、自定义Preference
1、继承Preference类
2、重写构造方法并调用setWidgetLayoutResource(R.layout.preference_xxx);方法,其中preference_xxx只是整
个布局的右侧布局而已。
3、重写onBindView(View view),onClick(),efaultValue(TypedArray a, int index),onGetDonSetInitialValue(
boolean restoreValue, Object defaultValue),onSaveInstanceState()和onRestoreInstanceState(Parcelable state)方法。
4、写一个继承BaseSavedState的静态内部类。
5、API Demos中自定义了一个保存int值的Preference。
6、具体自定义细节参考API Demos中的MyPreference类。
六、实际上由于UI的不自由,很少见到使用。