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

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

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

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

先新建一个工程:

Activity继承自PreferenceActivity

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

01.<?xml version="1.0" encoding="UTF-8"?>
02.<PreferenceScreen
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中代码修改如下,就可实现嵌套设置菜单

01.<?xml version="1.0" encoding="UTF-8"?>
02.<PreferenceScreen
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。 详细请看:http://blog.csdn.net/ichliebephone/article/details/5916320

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

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

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方法来加载上面的页面布局

1.public void onBuildHeaders(List<Header> target)
2.{
3.    // 加载选项设置列表的布局文件
4.    loadHeadersFromResource(R.xml.preference_headers, target);
5.}

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

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

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

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>

运行结果:

源代码下载:http://www.it165.net/uploadfile/files/2014/0212/iPhones.rar

PreferenceActivity的使用的更多相关文章

  1. Android ListView ListActivity PreferenceActivity背景变黑的问题ZT

    Android ListView ListActivity PreferenceActivity背景变黑的问题 ListView在滚动时背景会变暗甚至变黑,这个要从Listview的效果说起,默认的L ...

  2. Android笔记——PreferenceActivity结合PreferenceFragment创建设置界面

    1.创建类继承PreferenceActivity 2.该类必须重写OnBuildHeaders和isValidFragment方法.         (1)OnBuildHeaders方法中使用lo ...

  3. PreferenceActivity使用方法

              public class MainActivity extends Activity { @Override protected void onCreate(Bundle save ...

  4. Xamarin android PreferenceActivity 实现应用程序首选项设置(一)

    应用程序首选项屏幕 类似系统设置界面. PreferenceActivity 是另一种类型的Activity,通过PreferenceActivity 可以以最少量的工作显示某些Preference列 ...

  5. PreferenceActivity 自动保存属性

    package com.example.preference; import android.content.Context; import android.os.Bundle; import and ...

  6. Android 软件开发之 PreferenceActivity 中的组件

    1.PreferenceActivity 介绍 PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的 ...

  7. Android学习笔记(十四)方便实用的首选项-PreferenceActivity

    突然发现已经好多天没更新博客了,最近公司项目正在进行一个大跨度的重构,又碰上有新需求,一连好多天都是很晚才到家.其实这篇博文在草稿箱里面也存了很久了,本来想着不发了,不过感觉PreferenceAct ...

  8. 关于PreferenceActivity的使用和一些问题的解决(自己定义Title和取值)

    android的Setting往往用PreferenceActivity来写的 我们在建立layout文件: <PreferenceScreen xmlns:android="http ...

  9. Android之PreferenceActivity 详解

    看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找. PerferenceActivity是什么,看下面的截图: ...

  10. Android保存设置的PreferenceActivity

    界面XML文件:preference_setting.xml <?xml version="1.0" encoding="UTF-8"?> < ...

随机推荐

  1. 第 1 章 策略模式【Strategy Pattern】

    第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...

  2. 想学ps的,这全是精华,拿走不谢!!!

  3. sap中用函数增加断点(break point)

    如果在增强程序中,每次调试都要去程序里面设置断点很麻烦,为了解决这个问题,可以用下面的两个方法: 1: if sy-uname eq 'XXXX'      "XXX 为账号名字 break ...

  4. ABAP写的一个递归

    需求:计算下面树形结构中每个子节点与最上层父节点的对应关系. DATA:BEGIN OF lt_ztab OCCURS 0,      a  TYPE string,      b  TYPE str ...

  5. 【Earthquake, 2001 Open 】 0-1 分数规划

    71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...

  6. go与rpc

    Go语言的RPC介绍(含Protobuf-RPC) http://www.open-open.com/lib/view/open1389251727289.html

  7. 心愿:做一个精简版MFC

    我觉得自己有能力看懂MFC的C++代码和总体流程,但是由于MFC混杂了太多的东西,比如OLE等等不必要的东西,又做了无数的ASSERT判断,影响整体流程的理解.因此我要做一个精简版的MFC,而且能用它 ...

  8. QWidget与HWND的互相转换

    QWidget与HWND的互相转换 在编写Windows的应用程序时,我们有时不可避免地要与Windows平台固有的Win32 API打交道,但是Win32 API里面常常用到的HWND等诸多句柄QT ...

  9. Google 发布 Android 性能优化典范

    2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有 ...

  10. bzoj2434

    利用了bzoj3172提到的性质,x串在y串中的出现的次数即为在fail树上以x结尾节点为根的子树中有多少个节点在y串上所以很明显我们要离线解决,我们先把询问按y分类存起来然后我们顺着操作顺序来,出现 ...