PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存。Android专门为这种Activity提供了便捷的基类PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。
PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。
选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。
从3.0以后Android不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议将PreferenceActivity与PreferenceFragment结合使用。
先新建一个工程:
Activity继承自PreferenceActivity
package com.example.testpreferenceactivity; import android.os.Bundle; import android.preference.PreferenceActivity; public class MainActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); addPreferencesFromResource(R.xml.preference); } }
在res目录下新建立一个xml目录,在该目录中建立preference.xml
<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Settings"> <CheckBoxPreference android:title="Love me?" android:summaryOn="Yes,I love you!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> </PreferenceScreen>
可以将上面的preference.xml中代码修改如下,就可实现嵌套设置菜单
<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Settings"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Emotions" android:summary="settings about emotions"> <CheckBoxPreference android:title="Love me?" android:summaryOn="Yes,I love you!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> <CheckBoxPreference android:title="Hate me?" android:summaryOn="Yes,I hate you!" android:summaryOff="No,you are a good person." android:defaultValue="false"> </CheckBoxPreference> </PreferenceScreen> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Relations" android:summary="settings about relations"> <CheckBoxPreference android:title="Family?" android:summaryOn="Yes,we are family!" android:summaryOff="No,I am sorry." android:defaultValue="true"> </CheckBoxPreference> <CheckBoxPreference android:title="Friends?" android:summaryOn="Yes,we are friends!" android:summaryOff="No,I am sorry." android:defaultValue="false"> </CheckBoxPreference> </PreferenceScreen> </PreferenceScreen>将上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了
Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference。
详细请看:http://blog.csdn.net/ichliebephone/article/details/5916320
在上面我们提到Android不再推荐直接让PreferenceActivity加载选项设置布局文件,下面我们来看看PreferenceActivity与PreferenceFragment结合使用。
PreferenceActivity加载的选项设置列表布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 指定启动指定PreferenceFragment的列表项 --> <header android:fragment= "org.crazyit.app.PreferenceActivityTest$Prefs1Fragment" android:icon="@drawable/ic_settings_applications" android:title="程序选项设置" android:summary="设置应用的相关选项" /> <!-- 指定启动指定PreferenceFragment的列表项 --> <header android:fragment= "org.crazyit.app.PreferenceActivityTest$Prefs2Fragment" android:icon="@drawable/ic_settings_display" android:title="界面选项设置 " android:summary="设置显示界面的相关选项"> <!-- 使用extra可向Activity传入额外的数据 --> <extra android:name="website" android:value="www.crazyit.org" /> </header> <!-- 使用Intent启动指定Activity的列表项 --> <header android:icon="@drawable/ic_settings_display" android:title="使用Intent" android:summary="使用Intent启动某个Activity"> <intent android:action="android.intent.action.VIEW" android:data="http://www.crazyit.org" /> </header> </preference-headers>上面代码中Prefs1Fragment、Prefs2Fragment是两个内部类
在PreferenceActivity中重写onBuidHeaders方法来加载上面的页面布局
public void onBuildHeaders(List<Header> target) { // 加载选项设置列表的布局文件 loadHeadersFromResource(R.xml.preference_headers, target); }PreferenceActivity内部还有两个内部类,代码如下:
/** * */ package org.crazyit.app; import java.util.List; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.widget.Button; import android.widget.Toast; public class PreferenceActivityTest extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 该方法用于为该界面设置一个标题按钮 if (hasHeaders()) { Button button = new Button(this); button.setText("设置操作"); // 将该按钮添加到该界面上 setListFooter(button); } } // 重写该该方法,负责加载页面布局文件 @Override public void onBuildHeaders(List<Header> target) { // 加载选项设置列表的布局文件 loadHeadersFromResource(R.xml.preference_headers, target); } public static class Prefs1Fragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } public static class Prefs2Fragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.display_prefs); // 获取传入该Fragment的参数 String website = getArguments().getString("website"); Toast.makeText(getActivity() , "网站域名是:" + website , Toast.LENGTH_LONG).show(); } } }在两个Fragment中我们使用addPreferencesFromResource方法来加载设置的布局文件
preference.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置系统铃声 --> <RingtonePreference android:ringtoneType="all" android:title="设置铃声" android:summary="选择铃声(测试RingtonePreference)" android:showDefault="true" android:key="ring_key" android:showSilent="true"> </RingtonePreference> <PreferenceCategory android:title="个人信息设置组"> <!-- 通过输入框填写用户名 --> <EditTextPreference android:key="name" android:title="填写用户名" android:summary="填写您的用户名(测试EditTextPreference)" android:dialogTitle="您所使用的用户名为:" /> <!-- 通过列表框选择性别 --> <ListPreference android:key="gender" android:title="性别" android:summary="选择您的性别(测试ListPreference)" android:dialogTitle="ListPreference" android:entries="@array/gender_name_list" android:entryValues="@array/gender_value_list" /> </PreferenceCategory> <PreferenceCategory android:title="系统功能设置组 "> <CheckBoxPreference android:key="autoSave" android:title="自动保存进度" android:summaryOn="自动保存: 开启" android:summaryOff="自动保存: 关闭" android:defaultValue="true" /> </PreferenceCategory> </PreferenceScreen>display_prefs.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="背景灯光组"> <!-- 通过列表框选择灯光强度 --> <ListPreference android:key="light" android:title="灯光强度" android:summary="请选择灯光强度(测试ListPreference)" android:dialogTitle="请选择灯光强度" android:entries="@array/light_strength_list" android:entryValues="@array/light_value_list" /> </PreferenceCategory> <PreferenceCategory android:title="文字显示组 "> <!-- 通过SwitchPreference设置是否自动滚屏 --> <SwitchPreference android:key="autoScroll" android:title="自动滚屏" android:summaryOn="自动滚屏: 开启" android:summaryOff="自动滚屏: 关闭" android:defaultValue="true" /> </PreferenceCategory> </PreferenceScreen>
运行结果:
源代码下载:http://download.csdn.net/detail/lxq_xsyu/6915019
原文:http://blog.csdn.net/dawanganban/article/details/19082949