PreferenceActivity是一个非常有用的基类,当我们开发​​Android​​项目时避免不了选项设置,这些设置习惯用Preference来保存。​​Android​​专门为这种Activity提供了便捷的基类PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。

PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。

选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。

从3.0以后Android不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议将PreferenceActivity与PreferenceFragment结合使用。

先新建一个工程:

Activity继承自PreferenceActivity

 




​view source​​​​print​​​​?​



​01.​​​​package​​ ​​com.example.testpreferenceactivity;​


​02.​​ 


​03.​​​​import​​ ​​android.os.Bundle;​


​04.​​​​import​​ ​​android.preference.PreferenceActivity;​


​05.​​ 


​06.​​​​public​​ ​​class​​ ​​MainActivity ​​​​extends​​ ​​PreferenceActivity {​


​07.​​ 


​08.​​​​@Override​


​09.​​​​protected​​ ​​void​​ ​​onCreate(Bundle savedInstanceState) {​


​10.​​​​super​​​​.onCreate(savedInstanceState);​


​11.​​​​//setContentView(R.layout.activity_main);​


​12.​​​​addPreferencesFromResource(R.xml.preference);​


​13.​​​​}​


​14.​​​​}​


 

在res目录下新建立一个xml目录,在该目录中建立preference.xml

 




​view source​​​​print​​​​?​



​01.​​​​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"UTF-8"​​​​?>​


​02.​​​​<PreferenceScreen ​


​03.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​


​04.​​​​android:title=​​​​"Settings"​​​​>​


​05.​​​​<CheckBoxPreference ​


​06.​​​​android:title=​​​​"Love me?"​


​07.​​​​android:summaryOn=​​​​"Yes,I love you!"​


​08.​​​​android:summaryOff=​​​​"No,I am sorry."​


​09.​​​​android:defaultValue=​​​​"true"​​​​>​


​10.​​​​</CheckBoxPreference>​


​11.​​​​</PreferenceScreen>​



 

可以将上面的preference.xml中代码修改如下,就可实现嵌套设置菜单

 




​view source​​​​print​​​​?​



​01.​​​​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"UTF-8"​​​​?>​


​02.​​​​<PreferenceScreen ​


​03.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​


​04.​​​​android:title=​​​​"Settings"​​​​>​


​05.​​​​<PreferenceScreen ​


​06.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​


​07.​​​​android:title=​​​​"Emotions"​


​08.​​​​android:summary=​​​​"settings about emotions"​​​​>​


​09.​​​​<CheckBoxPreference  ​


​10.​​​​android:title=​​​​"Love me?"​


​11.​​​​android:summaryOn=​​​​"Yes,I love you!"​


​12.​​​​android:summaryOff=​​​​"No,I am sorry."​


​13.​​​​android:defaultValue=​​​​"true"​​​​>​


​14.​​​​</CheckBoxPreference>​


​15.​​​​<CheckBoxPreference ​


​16.​​​​android:title=​​​​"Hate me?"​


​17.​​​​android:summaryOn=​​​​"Yes,I hate you!"​


​18.​​​​android:summaryOff=​​​​"No,you are a good person."​


​19.​​​​android:defaultValue=​​​​"false"​​​​>​


​20.​​​​</CheckBoxPreference>     ​


​21.​​​​</PreferenceScreen>​


​22.​​​​<PreferenceScreen ​


​23.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​


​24.​​​​android:title=​​​​"Relations"​


​25.​​​​android:summary=​​​​"settings about relations"​​​​>​


​26.​​​​<CheckBoxPreference ​


​27.​​​​android:title=​​​​"Family?"​


​28.​​​​android:summaryOn=​​​​"Yes,we are family!"​


​29.​​​​android:summaryOff=​​​​"No,I am sorry."​


​30.​​​​android:defaultValue=​​​​"true"​​​​>​


​31.​​​​</CheckBoxPreference>​


​32.​​​​<CheckBoxPreference ​


​33.​​​​android:title=​​​​"Friends?"​


​34.​​​​android:summaryOn=​​​​"Yes,we are friends!"​


​35.​​​​android:summaryOff=​​​​"No,I am sorry."​


​36.​​​​android:defaultValue=​​​​"false"​​​​>​


​37.​​​​</CheckBoxPreference>     ​


​38.​​​​</PreferenceScreen>   ​


​39.​​​​</PreferenceScreen>​


将上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了

 

Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference。 详细请看:

在上面我们提到Android不再推荐直接让PreferenceActivity加载选项设置布局文件,下面我们来看看PreferenceActivity与PreferenceFragment结合使用。

PreferenceActivity加载的选项设置列表布局文件如下:

 




​view source​​​​print​​​​?​



​01.​​​​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"utf-8"​​​​?>​


​02.​​​​<preference-headers ​


​03.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​​​​>​


​04.​​​​<!-- 指定启动指定PreferenceFragment的列表项 -->​


​05.​​​​<header android:fragment=​


​06.​​​​"org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"​


​07.​​​​android:icon=​​​​"@drawable/ic_settings_applications"​


​08.​​​​android:title=​​​​"程序选项设置"​


​09.​​​​android:summary=​​​​"设置应用的相关选项"​​ ​​/>​


​10.​​​​<!-- 指定启动指定PreferenceFragment的列表项 --> ​


​11.​​​​<header android:fragment=​


​12.​​​​"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"​


​13.​​​​android:icon=​​​​"@drawable/ic_settings_display"​


​14.​​​​android:title=​​​​"界面选项设置 "​


​15.​​​​android:summary=​​​​"设置显示界面的相关选项"​​​​>​


​16.​​​​<!-- 使用extra可向Activity传入额外的数据 -->​


​17.​​​​<extra android:name=​​​​"website"​


​18.​​​​android:value=​​​​"www.crazyit.org"​​ ​​/>​


​19.​​​​</header>​


​20.​​​​<!-- 使用Intent启动指定Activity的列表项 -->​


​21.​​​​<header​


​22.​​​​android:icon=​​​​"@drawable/ic_settings_display"​


​23.​​​​android:title=​​​​"使用Intent"​


​24.​​​​android:summary=​​​​"使用Intent启动某个Activity"​​​​>​


​25.​​​​<intent  android:action=​​​​"android.intent.action.VIEW"​


​26.​​​​android:data=​​​​"http://www.crazyit.org"​​ ​​/>​


​27.​​​​</header>​


​28.​​​​</preference-headers>​


上面代码中Prefs1Fragment、Prefs2Fragment是两个内部类

 

在PreferenceActivity中重写onBuidHeaders方法来加载上面的页面布局

 




​view source​​​​print​​​​?​



​1.​​​​public​​ ​​void​​ ​​onBuildHeaders(List<Header> target)​


​2.​​​​{​


​3.​​​​// 加载选项设置列表的布局文件​


​4.​​​​loadHeadersFromResource(R.xml.preference_headers, target);​


​5.​​​​}​


PreferenceActivity内部还有两个内部类,代码如下:

 

 




​view source​​​​print​​​​?​



​01.​​​​/**​


​02.​​​​*​


​03.​​​​*/​


​04.​​​​package​​ ​​org.crazyit.app;​


​05.​​ 


​06.​​​​import​​ ​​java.util.List;​


​07.​​ 


​08.​​​​import​​ ​​android.os.Bundle;​


​09.​​​​import​​ ​​android.preference.PreferenceActivity;​


​10.​​​​import​​ ​​android.preference.PreferenceFragment;​


​11.​​​​import​​ ​​android.widget.Button;​


​12.​​​​import​​ ​​android.widget.Toast;​


​13.​​ 


​14.​​ 


​15.​​​​public​​ ​​class​​ ​​PreferenceActivityTest ​​​​extends​​ ​​PreferenceActivity​


​16.​​​​{​


​17.​​​​@Override​


​18.​​​​protected​​ ​​void​​ ​​onCreate(Bundle savedInstanceState)​


​19.​​​​{​


​20.​​​​super​​​​.onCreate(savedInstanceState);​


​21.​​​​// 该方法用于为该界面设置一个标题按钮​


​22.​​​​if​​ ​​(hasHeaders())​


​23.​​​​{​


​24.​​​​Button button = ​​​​new​​ ​​Button(​​​​this​​​​);​


​25.​​​​button.setText(​​​​"设置操作"​​​​);​


​26.​​​​// 将该按钮添加到该界面上​


​27.​​​​setListFooter(button);​


​28.​​​​}​


​29.​​​​}​


​30.​​​​// 重写该该方法,负责加载页面布局文件​


​31.​​​​@Override​


​32.​​​​public​​ ​​void​​ ​​onBuildHeaders(List<Header> target)​


​33.​​​​{​


​34.​​​​// 加载选项设置列表的布局文件​


​35.​​​​loadHeadersFromResource(R.xml.preference_headers, target);​


​36.​​​​}​


​37.​​ 


​38.​​​​public​​ ​​static​​ ​​class​​ ​​Prefs1Fragment ​​​​extends​​ ​​PreferenceFragment​


​39.​​​​{​


​40.​​​​@Override​


​41.​​​​public​​ ​​void​​ ​​onCreate(Bundle savedInstanceState)​


​42.​​​​{​


​43.​​​​super​​​​.onCreate(savedInstanceState);​


​44.​​​​addPreferencesFromResource(R.xml.preferences);​


​45.​​​​}​


​46.​​​​}​


​47.​​​​public​​ ​​static​​ ​​class​​ ​​Prefs2Fragment ​​​​extends​​ ​​PreferenceFragment​


​48.​​​​{​


​49.​​​​@Override​


​50.​​​​public​​ ​​void​​ ​​onCreate(Bundle savedInstanceState)​


​51.​​​​{​


​52.​​​​super​​​​.onCreate(savedInstanceState);​


​53.​​​​addPreferencesFromResource(R.xml.display_prefs);​


​54.​​​​// 获取传入该Fragment的参数​


​55.​​​​String website = getArguments().getString(​​​​"website"​​​​);​


​56.​​​​Toast.makeText(getActivity()​


​57.​​​​, ​​​​"网站域名是:"​​ ​​+ website , Toast.LENGTH_LONG).show();​


​58.​​​​}​


​59.​​​​}   ​


​60.​​​​}​


在两个Fragment中我们使用addPreferencesFromResource方法来加载设置的布局文件

 

preference.xml

 




​view source​​​​print​​​​?​



​01.​​​​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"utf-8"​​​​?>​


​02.​​​​<PreferenceScreen ​


​03.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​​​​>​


​04.​​​​<!-- 设置系统铃声 -->​


​05.​​​​<RingtonePreference​


​06.​​​​android:ringtoneType=​​​​"all"​


​07.​​​​android:title=​​​​"设置铃声"​


​08.​​​​android:summary=​​​​"选择铃声(测试RingtonePreference)"​


​09.​​​​android:showDefault=​​​​"true"​


​10.​​​​android:key=​​​​"ring_key"​


​11.​​​​android:showSilent=​​​​"true"​​​​>​


​12.​​​​</RingtonePreference>​


​13.​​​​<PreferenceCategory android:title=​​​​"个人信息设置组"​​​​>​


​14.​​​​<!-- 通过输入框填写用户名 -->​


​15.​​​​<EditTextPreference​


​16.​​​​android:key=​​​​"name"​


​17.​​​​android:title=​​​​"填写用户名"​


​18.​​​​android:summary=​​​​"填写您的用户名(测试EditTextPreference)"​


​19.​​​​android:dialogTitle=​​​​"您所使用的用户名为:"​​ ​​/>​


​20.​​​​<!-- 通过列表框选择性别 -->​


​21.​​​​<ListPreference​


​22.​​​​android:key=​​​​"gender"​


​23.​​​​android:title=​​​​"性别"​


​24.​​​​android:summary=​​​​"选择您的性别(测试ListPreference)"​


​25.​​​​android:dialogTitle=​​​​"ListPreference"​


​26.​​​​android:entries=​​​​"@array/gender_name_list"​


​27.​​​​android:entryValues=​​​​"@array/gender_value_list"​​ ​​/>​


​28.​​​​</PreferenceCategory>​


​29.​​​​<PreferenceCategory android:title=​​​​"系统功能设置组 "​​​​>​


​30.​​​​<CheckBoxPreference​


​31.​​​​android:key=​​​​"autoSave"​


​32.​​​​android:title=​​​​"自动保存进度"​


​33.​​​​android:summaryOn=​​​​"自动保存: 开启"​


​34.​​​​android:summaryOff=​​​​"自动保存: 关闭"​


​35.​​​​android:defaultValue=​​​​"true"​​ ​​/>​


​36.​​​​</PreferenceCategory> ​


​37.​​​​</PreferenceScreen>​


display_prefs.xml

 

 




​view source​​​​print​​​​?​



​01.​​​​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"utf-8"​​​​?>​


​02.​​​​<PreferenceScreen​


​03.​​​​xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​​​​>​


​04.​​​​<PreferenceCategory android:title=​​​​"背景灯光组"​​​​>​


​05.​​​​<!-- 通过列表框选择灯光强度 -->​


​06.​​​​<ListPreference​


​07.​​​​android:key=​​​​"light"​


​08.​​​​android:title=​​​​"灯光强度"​


​09.​​​​android:summary=​​​​"请选择灯光强度(测试ListPreference)"​


​10.​​​​android:dialogTitle=​​​​"请选择灯光强度"​


​11.​​​​android:entries=​​​​"@array/light_strength_list"​


​12.​​​​android:entryValues=​​​​"@array/light_value_list"​​ ​​/>​


​13.​​​​</PreferenceCategory>​


​14.​​​​<PreferenceCategory android:title=​​​​"文字显示组 "​​​​>​


​15.​​​​<!-- 通过SwitchPreference设置是否自动滚屏 -->​


​16.​​​​<SwitchPreference​


​17.​​​​android:key=​​​​"autoScroll"​


​18.​​​​android:title=​​​​"自动滚屏"​


​19.​​​​android:summaryOn=​​​​"自动滚屏: 开启"​


​20.​​​​android:summaryOff=​​​​"自动滚屏: 关闭"​


​21.​​​​android:defaultValue=​​​​"true"​​ ​​/>​


​22.​​​​</PreferenceCategory>​


​23.​​​​</PreferenceScreen>​