Preference从字面上看偏好,译为首选项。

一些配置数据,一些我们上次点击选择的内容。我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况,自己主动保存这些数据。并立时生效,同一时候Android提供一种类似的layout的方式来进行Prefernce的布局。

一个简单的Preferenece样例

步骤1:编写preference XML,在res/xml/下增加我们的preference XML文件,比如名字叫c21preference.xml

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

<!-- preference的组织方式有PreferenceScreen和PreferenceCategory。PreferenceCategory是带层次组织关系。在后面的样例体验。而PreferenceScreen就是最平白和基础的方式 -->

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 有四个基本组建。这个样例学习两个。里面的内容对比图,非常easy理解,RingtonePreference是选择铃音,这里给出两个选择,系统默认的铃音和无声 -->

    <CheckBoxPreference android:key="checkbox"

        android:title="CheckBox Preference"

        android:summary="Check it on , check it off"/>

    <RingtonePreference android:key="ringtone"

        android:title="Ringtone Preference"

        android:showDefault="true"

        android:showSilent="true"

        android:summary="Pick a tone, any tone"/>

</PreferenceScreen>

步骤2:在java源码中调用该xml。生成对应的preference界面

public class Chapter21Test1 extendsPreferenceActivity{

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.c21preference);

    }

}

和用layout方式一样。代码非常easy。

和以往界面最大的差别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入,上次的选项依旧保留。我们又一次向模拟器load应用,发现之前的选项仍然存在。我们能够利用preference。而无须人工对数据进行保存和读取,非常是方便。

步骤3:获取preference的数据

处了在preference的界面中可以保留数据,我们也希望可以读出数据,以便这些数据可以用在其它的activity中。假设还有一个activity和这些数据关联,并且希望可以实时进行同步。在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

首先要获取preferences,然后通过键值对的获取方式依据key获取数值。在xml中checkbox的key为“checkbox”,值的类型为布尔值。而rintong的值为String,比如:

protected void onResume() { //在还有一个Activity中

        super.onResume();

        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;

        System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值

        System.out.println(prefs.getString("ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值

    }

获取preferences能够通过三种方式:

一、getPreferences():能够获取同一activity中的preference;

二、getSharedPreferences():能够获取映用级别的preferences()。在这个样例中因为我们封装在同一app中。也能够使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);当中第一个參数name的格式是<package_name>_preferences;

三、getDefaultSharedPreferences():就是我们样例的方式,通过Android的偏好管理器来获取其所管理的preferences。

Preferenece数据的操作

在上面的样例中。preference的数值会被保留,并且能够在其它的activity中读取。假设须要清除数据。能够通过remove()清除某个名字的prefernece。clear()清除全部的preferences。

我们能够通过edit()获取preferences的editor,进而进行编辑,改动后。通过commit()将改动值保存。

Preferenece XML

Preference的XML能够通过PreferenceCategory来进行组织。PreferenceCategory能够将几个组建组合在一起,并加上标题。我们依旧用前面的xml样例,通过PreferenceCategory来进行组织,例如以下:和之前的样例比較。将chekcbox和rintong组织成为一个category,并加上了"simple Preferences"的标题。

<?xml version="1.0" encoding="utf-8"?

>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

       <PreferenceCategory android:title="Simple Preferences">

            <CheckBoxPreference android:key="checkbox" ..../>

            <RingtonePreference android:key="ringtone" ... />

       </PreferenceCategory>

</PreferenceScreen>

PreferenceCategory也能够嵌套PreferenceScreen。PreferenceScreen中的内容,将通过还有一屏来显示。我们在上面样例后面加入一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现。点击后新的一屏,由入PreferenceScreen定义。通过这个关系,我们能够组织自己的preference架构。

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

       <PreferenceCategory android:title="Simple Preferences">

            <CheckBoxPreference android:key="checkbox" ..../>

            <RingtonePreference android:key="ringtone" ... />

       </PreferenceCategory>

       <PreferenceCategory android:title="Detail Screens">

           <PreferenceScreen android:title="Detail"

               android:summary="Addtional preference help in another page">

               <CheckBoxPreference android:key="checkbox2"

                   android:title="Another Checkbox"

                   android:summary="On or Off, It's a problem...."/>

           </PreferenceScreen>

       </PreferenceCategory>

</PreferenceScreen>

在前面的样例中我们使用了CheckBox和Ringtong,在以下的样例,我们实验另外的两个组建EditText和List。这两种都是已弹框的方式。

在上面的样例我们继续添加内容

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

<PreferenceScreen ...>

       ......     

       <PreferenceCategory android:title="Other Preferences">

           <EditTextPreference android:key="text"

               android:title="Text Entry Dialog"

               android:summary="Click to pop up a field for entry"

               android:dialogTitle="Enter something useful"/>

           <ListPreference android:key="list"

               android:title="Selection Dialog"

               android:summary="Click to pop yo a list for select"

               android:entries="@array/cities"

               android:entryValues="@array/airport_codes"


               android:dialogTitle="Choose a City"/>

       </PreferenceCategory>

</PreferenceScreen>

在list中由两个引用@array/cities和@array/airport_codes。我们在资源文件里定义此两array。内容例如以下:

<resource>

     <string-array>

        <item>Pittsburgh</item>

        <item>Allentown/Bethlehem</item>

        <item>Erie</item>

        ... ...

    </string-array>

    <string-array name="airport_codes">

        <item>PHL</item>

        <item>PIT</item>

        <item>ABE</item>

        ... ...

    </string-array>

</resources>

执行结果如右图所看到的。对于EditText,键值对保存的值是String。即用户在输入框中输入的内容。List的情况略微复杂一些,在设置ListPreference的属性有一个entires。这是在List显示给用户看的内容,假设我们去获取preference的值。在这个样例为prefs.getString("list", "<unset>");,则返回在entryValues相应的数值。比如我们选择了第一个item:Pittsburgh,则获取的值为PHL。entries和entryValues是一一相应的。

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

Android学习笔记(四十):Preference使用的更多相关文章

  1. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  2. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  3. 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制

    目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...

  4. 【转】Pro Android学习笔记(十二):了解Intent(下)

    解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...

  5. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  6. Android学习笔记(十四)——自定义广播

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们除了可以通过广播接收器来接收系统广播, 还可以在应用程序中发送自定义的广播.下面我们来分别试一试发送自定义 ...

  7. Android学习笔记(十六)——数据库操作(上)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, ...

  8. Android学习笔记(十五)——实战:强制下线

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 实现强制下线功能的思路也比较简单,只需要在界面上弹出一个对话框, 让用户无法进行任何其他操作, 必须要点击对话 ...

  9. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  10. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

随机推荐

  1. tsunami:一种基于UDP协议的高速传输

    一. 需求 近期在做数据库迁移.常常须要打包实例传输.传统scp感觉非常慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源代码make ...

  2. (并查集)POJ 1308 & HDU 1325

    一开始以为两道题是一样的,POJ的过了直接用相同代码把HDU的交了,结果就悲剧了.最后发现HDU的没有考虑入度不能大于一. 题意:用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环.只 ...

  3. linux内核编译环境配置

    linux内核编译环境配置 如果不是编译内核,只需要安装与内核相匹配的kernel-devel开发包即可.即是/lib/modules/`uname -r`/build -> /usr/src/ ...

  4. Centos 7 学习之静态IP设置

    原文链接:http://blog.csdn.net/johnnycode/article/details/40624403 本学习主要针对 Centos 7.0.1406 版本进行学习整理! 如果你使 ...

  5. table显示边框问题,隐藏行线,列线

    只显示上边框 <table frame=above> 只显示下边框 <table frame=below> 只显示左.右边框 <table frame=vsides> ...

  6. Unix文本处理工具之awk

    Unix命令行下输入的命令是文本,输出也都是文本.因此,掌握Unix文本处理工具是很重要的一种能力.awk是Unix常用的文本处理工具中的一种,它是以其发明者(Aho,Weinberger和Kerni ...

  7. R语言数据框行转列实例

    目的:须要把数据框的行列进行转置 方法: # 原始数据框 > hrl_jd_mon     年份 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 1 2010年 51 ...

  8. schedule()函数的调用时机(周期性调度)

    今天纠正了一个由来已久的认识错误:一个进程的时间片用完之后,当再次发生时钟中断时内核会调用schedule()来进行调度,把当前的进程上下文切出CPU,并把选定的下一个进程切换进来运行.我一直以为sc ...

  9. [Cocos2d-x]CCSpriteBatchNode的使用

    文档: http://cocos2d.cocoachina.com/document/index/class?url=dd/d95/classcocos2d_1_1_c_c_sprite_batch_ ...

  10. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...