Android Preference经常使用在例如设置的功能,Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,这种就是使用android sharedpreferences方式进行保存的,不需要我们手动来写,下面的图片就是使用Preference来进行保存的

添加一个简单的Preference

添加一个Preference很简单,首先看下图片

我们在res目录下添加一个xml目录,里面添加一个itchq文件,这个文件相当于我们的Preference布局文件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <CheckBoxPreference
        android:key="checkbox"
        android:title="CheckBoxPreference"
        android:summary="check it box"
        />
    <RingtonePreference
        android:key="ring"
        android:title="ringtone"
        android:summary="check a ringtone"
        />
</PreferenceScreen>

这个就是itchq.xml里面的代码,这里面的东西往下有介绍。我们再来看看那个Activity里面如何使用的

package com.itchq.itchqpreference;
import com.itchq.itchqpreference.R;

import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.PreferenceActivity;
import android.preference.RingtonePreference;

public class ItChqActivity extends PreferenceActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.itchq);
    }

}

上面的就是Activity的代码,这个Activity不是继承Activity这个类的而是PreferenceActivity,其实这个看字面的意思就是Activity的继承子类,用法和Activity差不多相同的,在Activity中使用setContentView()方法来加载一个布局文件,在这里使用的是addPreferencesFromResource()方法来加载布局文件,既然是Activity就不要忘记在AndroidManifast.xml添加相应的配置,上面的运行结果如下图

  preference 通用的xml 布局属性

在preference布局文件中,我们可以会经常用到下面的属性,这些属性都是preference控件相互通用的。

android:key           这个属性相当于android:id的作用。用此key来唯一表示此Preference

android:title         Preference的标题,

android:summary       表示Preference提示语,相对于android:title来说显示要小点,而且显示位置在android:title下面

android:defaultValue   这个表示的是默认值,比如CheclPreference这种preference就可以指定默认是"true"还是“false”

android:enabled        表示该Preference是否可用状态

PreferenceScreen

preferenceScreen简单的说就是所有Preference元素的根节点,我们可以看做是每一个PrederenceActivity布局的开始元素,当然这个PreferenceScreen也可以作为一个组件出现,里面可以嵌套其它组件,那么这个将会以另外的一屏显示出来,就是当我们点击后出现一个新的屏幕

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

    <CheckBoxPreference
        android:key="checkbox"
        android:title="CheckBoxPreference"
        android:summary="check it box"
        />
    <RingtonePreference
        android:key="ring"
        android:title="ringtone"
        android:summary="check a ringtone"
        />
    <PreferenceScreen
        android:key="screen"
        android:title="PreferenceScreen"
        android:summary="screen it"
        >
        <SwitchPreference
            android:key="switch"
            android:title="switchPreference"
            android:summary="switch it"
            />
        <EditTextPreference
            android:key="edit"
            android:title="editPreference"
            android:summary="OK"
            />
    </PreferenceScreen>
</PreferenceScreen>

如上面的代码里面有一个PreferenceScreen,这个PreferenceScreen里面嵌套了SwitchPreference和EditTextPreference,android:key相当android:id,我们到时候通过这个在Activity中找到对应的组件,android:title就是标题,android:summary就是这个一个提示语,这三个属性都是最基本的信息,看下图:

上面图片中最后一项就是我们添加的,“PreferenceScreen”就是我们的android:title,“screen it”就是这个android:summary,那么当我们点击这个选项时就会跳转到一个新的页面,页面显示如下图:

这个就是上面的在PreferenceScreen中嵌套的两个组件,SwitchPreference和EditTextPreference

PreferenceCategory

PreferenceCategory 这个控件类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局看起来具有层次关系,美观

    <PreferenceCategory
        android:key="category"
        android:title="PreferenceCategory"
        >
         <EditTextPreference
            android:key="edit"
            android:title="category"
            android:summary="OK"
            />
    </PreferenceCategory>

如上图中Category前面有一天很大的线,这个就是使用了PreferenceCategory效果。

Preference这个控件这里简单介绍一下,这个就和我们的TextView是一样的,就是显示一个文本

ListPreference

ListPreference这个就是显示一个相当的list,先看下面的代码

    <ListPreference
        android:key="list"
        android:title="Options"
        android:entries="@array/entry_list"
        android:entryValues="@array/values_list"
        android:dialogTitle="list dialogtitle"
        android:defaultValue="1"
        />

我们可以看到在这个代码中android:entries属性表示的就是这个listView对话框控件欲显示的文本,android:entryValues与文本相对应的key-value键值对,value保存至sharedPreference文件,而我们的entries和entryValue属性使用的数组定义在资源文件arrays.xml的数组名,我们来看看arrays.xml文件的定义

<resources>

    <string-array name="entry_list">
        <item>total</item>
        <item>check</item>
        <item>airplace</item>
    </string-array>
    <string-array name="values_list">
        <item>0</item>
        <item>1</item>
        <item>2</item>
    </string-array>
</resources>

这个就是arrays.xml文件的定义,android:dialogTitle是指这个list弹出框的文本,android:defauleValues表示在缺省条件下显示哪个值,这个值对应的是values_list的值,我们先来看看效果

如图这个Options就是我们要ListPreference,当我们点击这个之后显示效果如下图:

看到了把,我们的这个dialog形式来显示listView的,默认android:defaultValues=“1”就是对应第二个"check",这个标题就是android:dialogTitle设置的

CheckBoxPreference

checkBoxPreference这个相当于checkBox,是一个多选,先看代码

    <CheckBoxPreference
        android:key="checkbox_one"
        android:title="checbox_one"
        android:summaryOn="On_check_one"
        android:summaryOff="offcheck_one"
        />
    <CheckBoxPreference
        android:key="checkbox_two"
        android:summaryOff="offcheck_two"
        android:summaryOn="On_check_two"
        android:title="checbox_two" />
    <CheckBoxPreference
        android:key="checkbox_three"
        android:summaryOff="offcheck_three"
        android:summaryOn="On_check_three"
        android:title="checbox_three" />

android:summaryOn和android:summaryOff表示在选择和不选择分别显示的summary,运行效果图如下:

当我们选择checkbox_one是下面的offcheck_one提示就会修改为On_check_one

EditTextPreference

等同于EditText,相关的代码显示如下:

    <EditTextPreference android:key="edit"
       android:title="Set Package Name"
        android:summary="Set the Package Name"
        android:dialogTitle="Package Name:" /> 

当我们点击下面的“Set Package Name“的时候就会弹出这么一个文本对话框,”Package Name“就是这个android:dialogTitle的属性

RingtonePreference

这个是一个铃声选项的功能,用得比较少不做介绍

MultiSelectListPreference

它的实现和ListPreference相似,不同的是还可以不选择或者多个选择,代码是和ListPreference一样的,运行效果如下图:

从上面一些基本的Preference控件已经差不多介绍完了,下面再来介绍一个有关于点击和存储的功能使用:

首先来介绍一下如何在我们的PreferenceActivity中找到我们的控件,我们在Activity是通过findViewById()来找到我们指定的控件的,那么在PreferenceActivity中我们可以使用findPreference这个方法来找到指定的方法,用法如下:

        mCheck=(CheckBoxPreference) findPreference("checkbox");
        mRing=(RingtonePreference) findPreference("ring");

findPreference里面的参数就是我们使用android:key所定义的,这个应该容易理解。

在PreferenceActivity方法中,一个比较重要的监听点击事件方法为

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub

        return true;
    }

参数 preference   表示的是点击的对象,在我们继承PreferenceActivity可以重写该方法,来完成我们对Preference事件的捕捉,用法如下

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub
        if(preference.getKey().equals("checkbox")){
            Log.i("itchq", "checkbox");
        }
        return true;
    }

除了上面这个监听的方法之外,还有两个重要的接口:

OnPreferenceChangeListener

当Preference的元素值发送改变时,触发该事件,记住只有元素值改变才会触发这个值,返回值为true 表示将新值写入sharedPreference文件中

false 则不将新值写入sharedPreference文件

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // TODO Auto-generated method stub
        return false;
    }

OnPreferenceClickListener

当点击控件时触发发生,可以做相应操作

    @Override
    public boolean onPreferenceClick(Preference preference) {
        // TODO Auto-generated method stub
        return false;
    }

那么这三个点击事件在一起是什么用的呢?它的规则如下:

点击某个Preference控件后,会先回调onPreferenceChange()方法,即是否保存值(这个下面会讲解这个值是如何保存的),然后再回调onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我们得到的控件值就是最新的Preference控件值。然后onPreferenceClick会比onPreferenceTreeClick()方法先调用,如果onPreferenceClick方法返回true,那就不会再调用onPreferenceTreeClick()方法,如果onPreferenceClick()返回false就会继续调用onPreferenceTreeClick()方法

数据的保存

前面我们说过,Android系统会将Preference元素的值存储在sharedPreference文件中。该文件存放路径位于 DDMS视图下的data/data/[packgename]/shared_prefs/文件下,命名约定为:packagename_preferencse.xml 如下图:

那么我们要如何去获取这些已经保存的数据呢?首先我们要通过xml中的key获取数值,就是Preference控件中android:key所对应的属性(已一个键值对的形式保存,name为Preference的key值,value为Preference的value值)读取方法如下:

         SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
         Log.i("itchq", "checbox="+prefs.getBoolean("checkbox",false));

我们通过getDefaultSharedPreferences()方法来读取的,”checkbox“就是我们CheckBoxPreference所定义的android:key属性值,这样是不是很方便,我们都不需要手动取保存这个对应的值,只要直接去取就可以了。preference的数值会被保留,而且可以在其他的 activity中读取。如果需要清除数据,可以通过remove()清除某个名字的prefernece,clear()清除所有的 preferences。我们可以通过edit()获取preferences的editor,进而进行编辑,修改后,通过commit()将修改值保存。

Android Preference使用的更多相关文章

  1. Android Preference详解

    转载请标明出处:ttp://blog.csdn.net/sk719887916/article/details/42437253 Preference 用来管理应用程序的偏好设置和保证使用这些的每个应 ...

  2. Android开发--ListPreferance 运行报错:android.preference.ListPreference.findIndexOfValue(ListPreference.java:169)

    在Stack Overflow上找到的答案:http://stackoverflow.com/questions/4357094/exception-on-listpreferences “i fix ...

  3. Android Preference

    http://blog.csdn.net/liuhe688/article/details/6448423 这个被google废弃了,替换方案是?

  4. Android中Preference的使用以及监听事件分析

    在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局.当然,凡事都有 ...

  5. Intellij idea 和android studio 代码给混淆

    Intellij idea 和android studio 代码给混淆 一.指令说明-optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassna ...

  6. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  7. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  8. 一种更清晰的Android架构(转)

    一种更清晰的Android架构   一种更清晰的Android架构 原文链接 : Architecting Android…The clean way? 译者 : Mr.Simple & So ...

  9. Android之自定义控件-下拉刷新

    实现效果: 图片素材:         --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name=& ...

随机推荐

  1. dwarf tower

    dwarf tower(dwarf.cpp/c/pas)[问题描述]Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品,它们的编号为1到n.现在Va ...

  2. 修改WAMP中mysql默认空密码

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...

  3. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

  4. 在Linux下的中断方式读取按键驱动程序

    // 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...

  5. Net设计模式实例系列文章总结

    1 什么是设计模式 设计模式是对在软件设计过程中重复出现的问题提出了一种比较好的解决方案.正如一位专家所说:设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案(The Smalltalk C ...

  6. 群体结构图形三剑客——PCA图

    重测序便宜了,群体的测序和分析也多了起来.群体结构分析,是重测序最常见的分析内容.群体结构分析应用十分广泛,首先其本身是群体进化关系分析里面最基础的分析内容,其次在进行GWAS分析的时候,本身也需要使 ...

  7. AVL的删除写法的一个错误

    今天在写AVL删除的时候犯了一个傻逼错误,调了很久,教训惨痛,引以为鉴. 树中允许有重复节点,如果删除的节点有重复,则只删除1个. AVL删除采取的方法是首先判断待删除节点是否存在,如果存在,那么判断 ...

  8. JAVA初学(1):值类型和引用类型的区别

    JAVA值类型和引用类型的区别(转)                                                          [定义] 引用类型表示你操作的数据是同一个,也就 ...

  9. (转)java中的进程与线程

    (转自地址http://www.ibm.com/developerworks/cn/java/j-lo-processthread/) Java 进程的建立方法 在 JDK 中,与进程有直接关系的类为 ...

  10. 【HDU】4405 Aeroplane chess

    http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意:每次可以走1~6格,初始化在第0格,走到>=n的格子就结束.还有m个传送门,表示可以从X[i] ...