PreferenceActivity
PreferenceActivity 是从api1 就加入的。android3.0之后有了fragment的概念后,也加入了PreferenceFragment。
Android提供preference这个键值对的方式 来处理这种情况,自动保存这些数据,并立时生效。Android提供一种类似layout的方式来进行Prefernce的布局。
当我们退出actitvity后再次进入,上次的选项依然保留。我们可以利用preference这一特性,而无须人工对数据进行保存和读取,很是方便。
preferce xml
preference xml 的位置在res/xml目录下
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- <PreferenceCategory android:title="First Category">
<ListPreference
android:defaultValue="list key default value"
android:dialogTitle="list_dialog_title"
android:entries="@array/list_preference"
android:entryValues="@array/list_preference"
android:key="list_key"
android:summary="list_summary"
android:title="list title"/>
</PreferenceCategory>
-->
<PreferenceCategory android:title="Second Category">
<EditTextPreference
android:defaultValue="edit default value"
android:key="edittext_key"
android:summary="edit summary"
android:title="edit title"/>
<CheckBoxPreference
android:defaultValue="checkbox default value"
android:key="checkbox_key"
android:summary="checkbox summary"
android:title="checkbox title"
/>
<EditTextPreference
android:defaultValue="0"
android:key="num_key"
android:numeric="integer"
android:summary="edit summary"
android:title="input number"/>
</PreferenceCategory>
</PreferenceScreen>
调用
addPreferencesFromResource(R.xml.testpreference); // 可以将xml解析成layout
读取数据
想要 获取preference的数据,首先要获取preferences,然后通过 键值对的获取方式根据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String
SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
获取preferences的三种方式
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences( “com.wei.android.learning_preferences” ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我们例子的方式,通过Android的偏好管理器来获取其所管理的preferences
click触发规则
1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;
如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。
补充:点击某个Preference控件后,会先回调onPreferenceChange()方法,即是否保存值,然后再回调onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick
方法中我们得到的控件值就是最新的Preference控件值
PreferenceCategory也可以嵌套PreferenceScreen,PreferenceScreen中的内容,将通过另一屏来显示,我们在上面例子后面添加一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏,进入PreferenceScreen定义。通过这个关系,我们可以组织自己的preference架构。