目录(?)[-]

  1. 代码实现
  2. header xml文件

在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型。在代码中,我们为了不提示warning,加入了@SuppressWarnings("deprecation"),表明这是老版本的处理方式。自从Android 3.0引入fragment后,preference在实现有变化。

PreferenceActivity能够根据设备的尺寸大小不同,提供不同的UI,如设备是平板,显示如下。左边是preference header,右边是PreferenceScreen对象。

如设备是phone,显示如下:

代码实现

public class HeadPreferenceActivity extends PreferenceActivity
        
    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState); 
        if(hasHeaders()){  //如有header,则在最下面加一个button。本例无论平板还是phone,都返回true
            Button button = new Button(this); 
            button.setText("Some Action"); 
            setListFooter(button); 
        } 
    }

@Override // 在PreferenceActivity的回调函数onBuildHeaders()中加入header
    public void onBuildHeaders(List<Header> target) { 
        loadHeadersFromResource(R.xml.header, target);
    } 
    
    // 如果不作为Fragment内部类,例如独立作为一个类,则不需要static,PreferenceFragment和之前老的PreferenceActivity相似,我们在此通过res/xml的资源加入PreferenceScreen。
   public static class Pref1Fragment extends PreferenceFragment{ 
        @Override 
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState); 
            Log.i("PRO args", "Pref1Fragment Arguments: " + getArguments());
            addPreferencesFromResource(R.xml.sound); //R.xml.sound为之前学习过的PreferenceScreen xml文件
        }          
    }

public static class Pref2Fragment extends PreferenceFragment{
        @Override 
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState); 
            Log.i("PRO args", "Pref2Fragment Arguments: " + getArguments());  //可以从xml文件中读取参数,类型为Bundle 
            addPreferencesFromResource(R.xml.complex);  //R.xml.complex为之前学习过的PreferenceScreen xml文件
        }         
    }  
    
}

在代码实现中,关键在于header的加入,我们来看看res/xml/header.xml文件

header xml文件

<?xml version="1.0" encoding="utf-8"?> 
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 和fragment class属性相似,fragment属性为PreferenceFragment的类,用于用户点list中的改header后,获取对应的PreferenceScreen对象。本例为内部类 -->
    <header android:fragment="cn.wei.flowingflying.propreferences.HeadPreferenceActivity$Pref1Fragment"
        android:icon="@drawable/creep" 
        android:title="Sound" 
        android:summary="These are sound preferences" />

<!-- 第二个header,我们增加了extra data,可以在代码中读取,本例通过Log.d将相关信息显示,如下。用户按第一个header,显示第一行,参数为null,用户按第二个header时,显示第二行,通过Bundle来传递Extra信息 -->
     
    <header android:fragment="cn.wei.flowingflying.propreferences.HeadPreferenceActivity$Pref2Fragment"
        android:icon="@drawable/creep003" 
        android:title="Complex" 
        android:summary="These are complex preferences" > 
        <extra android:name="someKey" android:value="someHeaderValue" />
    </header>

<!-- 这是非内部类的试验,只要是PreferenceFragment,无论是否静态类、内部类,都可以 
    <header android:fragment="cn.wei.flowingflying.propreferences.ListPreferenceFragment"
        android:icon="@drawable/creep004" 
        android:title="List Preferences" 
        android:summary="These are list preferences" /> -->

<!-- header也可以通过intent唤起其他activity,而不只限于preference fragment,本例将通过浏览器打开某网页 -->
    <header android:icon="@drawable/ic_launcher" 
            android:title="Intent" 
            android:summary="Launches an Intent."> 
        <intent android:action="android.intent.action.VIEW"  android:data="http://www.android.com" />
    </header> 
    
</preference-headers>

本博文涉及的例子代码,可以在Pro Android学习:Preference(首选项)小例子中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(六二):Preferences(6):header的更多相关文章

  1. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  2. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  3. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  4. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  5. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  6. 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout

    相对布局:RelativeLayout RelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置.缺省控件的位置为最 ...

  7. 【转】 Pro Android学习笔记(二一):用户界面和控制(9):Gallery和SimpleAdapter

    Gallery画廊式控件,如图所示,但是在API level 16,也即Android 4.1,被deprecated,可以使用HorizontableScroolView和ViewPager.但是后 ...

  8. 【转】Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme

    目录(?)[-] 静态格式 代码中设定 Style Theme 静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u& ...

  9. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  10. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

随机推荐

  1. c++操作flash

    c++操作falsh,忘了原文在哪了,自己尝试了,直接贴代码 // SDK版本 //////////////////////////////////////////////////////////// ...

  2. 我的Android进阶之旅------>如何获取系统中定义了那些权限

    在Window控制台中输入如下命令可以看到Android系统中列出的所有权限(如果自定义权限注册成功,在这里也会找到这些自定义的权限) adb shell pm list permissions C: ...

  3. RxJava2 源代码解析(一)

    转载请标明出处: http://blog.csdn.net/zxt0601/article/details/61614799 本文出自:[张旭童的博客](http://blog.csdn.net/zx ...

  4. 003-unity3d 物理引擎简介以及示例

    一.概述 物理引擎就是模拟真实世界中物体碰撞.跌落等反应的引擎,通过ballence.愤怒的小鸟等理解.Unity3D的物理引擎使用的是Nvidia的PhysX. 物理引擎是一个计算机程序模拟牛顿力学 ...

  5. 使用javascript的eval函数解析json字符串,提示“not avalible”怎么办?

    按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对": var jsonString = '{ "firstName": "Brett ...

  6. ip地址设备信息

    其实是个小问题,在项目中遇到要获取手机ip地址和mac地址的问题,mac地址获取用appcan的uexDevice插件可以实现. 但是ip地址,获取的方式很多,具体有搜狐/腾讯/新浪等提供的接口.但是 ...

  7. MYSQL:基础——3N范式的表结构设计

    基于3N范式的数据表设计 范式 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 关系数据库现有六种范 ...

  8. vim 正则表达式查找ip

    特别说明: \v \v 表示 very magic 这种模式下很多字符默认就表示一些特殊意义,而不用加 \ 如 : < 单词开头 > 单词结尾 ( 组开始 ) 组结束 { 次数开始 } 次 ...

  9. JavaScript日期选择控件Kalendae

    在线演示 本地下载

  10. SpringCloud-服务的注册与发现(Eureka)

    SpringCloud 简介 SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环境简 ...