zoukankan      html  css  js  c++  java
  • PreferenceActivity的使用

    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

  • 相关阅读:
    常用HTTP Contenttype头信息及文件类型对照
    Web开发专用IDE:Aptana Studio 3.0
    如果张柏芝的孩子长大
    Apache日志分析工具Awstats的安装和配置
    台北貢寮~三貂角燈塔
    [转]ASP,PHP,JSP,ASP.NET 比较
    联想 Thinkpad SL410使用体验
    2011年6月TIOBE编程语言走势图及指数
    百度搜索能力越来越差了,看下图
    PHP 5.3.x中弃用的特性 Deprecated
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3675404.html
Copyright © 2011-2022 走看看