安卓Preference详解

Preference 用来管理应用程序的偏好设置和保证使用这些的每个应用程序的所有参数 拥有同样的方式和用户体验   并且系统和其他应用程序的UI保持偏一致。

一个应用程序的偏好部分应作为一个独立的活动扩展preferenceactivity类 类中的对象应该是preferencescreen ,preferencescreen包含偏好等元素的布局的根元素 比如checkboxpreference EditTextPreferenceListPreferencePreferenceCategoryRingtonePreference.

对于一个给定的偏好设置将自动保存到SharedPreferences , 拿到SharedPreferences应用实例的很简单getsharedpreferences();值的注意的是保存首选项只能由创建的应用程序去操作。

一般设置对应的UI如图

android 3.0以下版本,必须使用PreferenceActivity类来构建。  高于或等于android 3.0版本
使用PreferenceFragment。当然设备屏幕如果足够大的话还是可以使用PreferenceActivity创建双面板布局来显示多组设置

安卓给我们提供了一下接口:


Preference.OnPreferenceChangeListener


接口定义一个回调时调用的值Preference由用户改变了,是吗 关于设置和/或持久化。


Preference.OnPreferenceClickListener


接口定义一个回调时被调用Preference是 点击。


PreferenceManager.OnActivityDestroyListener


接口定义一个类时,将调用容器的活动 被摧毁。


PreferenceManager.OnActivityResultListener


接口定义一个类时,将调用容器的活动 接收到一个活动的结果。


PreferenceManager.OnActivityStopListener


接口定义一个类时,将调用容器的活动 是停止了。

也定义了如下api:


CheckBoxPreference


一个Preference提供checkbox小部件 功能。


DialogPreference


一个基类Preference对象 基于对话框的。


EditTextPreference


一个Preference允许字符串 输入。


ListPreference


一个Preference显示条目的列表 一个对话框。


Preference


代表的基本UI构建的偏好 块显示的PreferenceActivity的形式ListView


Preference.BaseSavedState


一个基类来管理实例的状态Preference


preferenceactivity


显示了一个层次Preference对象作为 列表,可能跨越多个屏幕。


PreferenceCategory


用于集团Preference对象 并提供一个残疾人标题上面。


PreferenceGroup


一个容器为多个Preference对象。


PreferenceManager


用于帮助创建Preference层次结构 从活动或XML。


PreferenceScreen


代表一个顶级Preference那 是优先的层次结构的根。


RingtonePreference


一个Preference允许用户选择从这些设备上的铃声。

1 Preference
可实现的接口

interfacePreference.OnPreferenceChangeListener(偏好值已更改的用户和改变的时候
调用) 和Preference.OnPreferenceClickListener(偏好设置被点击的时候调用

装载请标明出处::http://blog.csdn.net/sk719887916

2.Preference元素的通用XML Attributes:

android:key :      key:唯一标识,SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 。

android:defaultValue : 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态。

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

android:title :              每个Preference在PreferenceScreen布局上显示的标题——大标题

android:summary :      每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)

android:persistent:    表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。

android:layout
        在一个preferenceactivity的偏好布局 用于填充view

android:dependency:    表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。B可用,

则A可用;B不可用,则A不可用。

android:icon:
   偏好图标    对于偏好选择图标必须是一个引用到另一个资源的形式或以packagetypename 主题属性.

android:disableDependentsState:  与android:dependency相反。B可用,则A不可用;B不可用,则A可用。

android:order:表示偏好顺序,对于偏好较低的值的顺序是先点如果不指定默认的排序将字母必须是一个整数,如100,这也可能是一个参考值在含有这类这相当于全局属性资源符号秩序的形式或
形式packagetypename主题属性的一个资源。

android:shouldDisableView:是否被禁用,这种偏好是必须是布尔值true或false 这也可能是一个参考的形式或主题属性packagetypename资源,packagetypename形式包含一个值   相当于全局属性资源符号shoulddisableview相关方法

android:selectable:偏好是否是可选的。

android:widgetLayout:可以做小部部件部分的布局。

android:fragment
 使用时,可以碎片化PreferenceActivity。

3.显示Preference布局结构的方法为:

使我们的Activity继承PreferenceActivity,然后在onCreate()方法中通过

addPreferencesFromResource(R.xml.custom_preference) (我们自定义的Preference 布局)。

怎么样,是不是似曾相识?稍后会用一个Demo来为您详述。

常用的方法则包括:

getKey()            setKey()

getSummary()        setSummary()

getText()           setText()

getXXX()代表取得xxx属性的值。

一个简易的效果图如下:

4.Preference的跳转:

方法一:在配置每个Preference元素节点时,我们可以显示为点击它时所跳转的Intent。点击该Preference,跳转至目标Intent。除非在onPreferenceTreeClick()方法中进行抉择。在xml中配置如下:

</pre><pre name="code" class="java" style="font-size: 14px; color: rgb(34, 34, 34);">1.<Preference android:key="wifi_setting" android:title="Wi-Fi设置"  
2.    android:summary="设置和管理无线接入点" android:dependency="apply_wifi">  
3.    <!-- 点击时 自定义一个默认跳转Intent  action指定隐式Intent -->  
4.    <!-- action指定隐式Intent ; targetPackage和targetClass指定显示Intent-->  
5.    <intent android:action="com.feixun.action.seemAction"   
6.        android:targetPackage="com.feixun.qin" android:targetClass="com.feixun.qin.MainActivity" />  
7.</Preference>  

8. android:key 唯一标识符。它对应保存的XML保存的配置文件中的节点的 name属性

9. android:defaultValue 默认值,对应XML中的Value属性的值。

10.

方法二:可以在onPreferenceTreeClick()创建新的intent显示的进行跳转。

接下来,对每个Preference的的独有XML Attributes和方法进行一下总结,使大家有更好的深入理解。

1、EditPreference

可输入的设置项

方法:

getEditText()  返回的是我们在该控件中输入的文本框值

getText()     返回的是我们之前sharedPreferen文件保存的值

2、ListPreference

多选对话框设置项

XML Attributes:

android:dialogTitle:弹出控件对话框时显示的标题

android:entries:类型为array,控件欲显示的文本

android:entryValues:类型为array,与文本相对应的key-value键值对,value保存至sharedPreference文件

说明:entries和entryValue属性使用的数组为定义在资源文件arrays.xml的数组名:

方法:

CharSequence[]    getEntries(): 返回的是控件显示文本的一个”key”数组,对应于属性android:entries

CharSequence[]    getEntryValues():返回的一个”value”数组,对应于属性android: entryValues

CharSequence      getEntry(): 返回当前选择文本

String          getValue() :返回当前选中文本选中的value 。

其实用法和对选对话框一致 只不过做了保存设置。

采用的数组为:

entries:列表中显示的值。为一个数组,通读通过资源文件进行设置。

entryValues:列表中实际保存的值,也entries对应。为一个数组,通读通过资源文件进行设置。以下代码显示的是arrays.xml文件中内容:

<resources>
<string-array name="department">
<item>春节</item>
<item>元旦</item>
<item>元宵</item>
</string-array>
<string-array name="department_value">
<item>001</item>
<item>002</item>
<item>003</item>
</string-array>
</resources>

3 CheckBoxPreference

可点击的设置项

4  dialogPreference

弹出一个对话框 用户选择确定和取消

重点:分析Preference事件

以下摘自网络:

------------------------------------------------------------------------------------

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

public booleanonPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference)

说 明 : 当Preference控件被点击时,触发该方法。

参数说明: preference 点击的对象。

返回值:   true  代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。 例如,不跳转至默认Intent。

false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。

在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。

相信通过前面的介绍,你一定知道了如何使用了Preference家族并且对其触发方法。下面我们抛出另外两枚炸弹——

Preference相关的两个重要监听接口。

★  Preference.OnPreferenceChangeListener     该监听器的一个重要方法如下:

boolean onPreferenceChange(Preference preference,Object objValue)

说明:  当Preference的元素值发送改变时,触发该事件。

返回值:true  代表将新值写入sharedPreference文件中。

false 则不将新值写入sharedPreference文件

★   Preference.OnPreferenceClickListener      该监听器的一个重要方法如下:

public booleanonPreferenceClick(Preference preference)

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

那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,

它的触发规则如下:

1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;

如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。

2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。

补充:点击某个Preference控件后,会先回调onPreferenceChange()方法,即是否保存值,然后再回调onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick

方法中我们得到的控件值就是最新的Preference控件值。

那么,开始我们的实战之旅吧! 下面给您最火热的战场。

1,新建我们的preference.xml文件。

① 在res文件夹下,新建xml文件夹。

② 在新建的xml文件夹下,新建Android XML File。命名为mypeference.xml 。类型选择为Preference。

③ 打开我们的mypeference.xml,视图选择Structure。可以手动配置我们的布局文件。可选的Preference空间如下:

导出的xml文件:yourpageName"_prefenrences.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="Apply_wireless" value="false" />
<boolean name="apply_fly" value="true" />
<boolean name="apply_bluetooth" value="true" />
<string name="number_edit2">[email protected]</string>
<boolean name="apply_wifi" value="true" />
<boolean name="apply_gps" value="true" />
<string name="number_edit">[email protected]</string>
</map>

------------------------------------------------------------------------------------------------------------------------------

二、PreferenceFragment

PreferenceFragment可以在一屏幕放上多个SharedPreferences片段。实现多屏结构显示 ,pad用的居多 效果如下。

用于显示层次结构的偏好对象列表   这些列表的选项将自动保存到SharedPreferences作为与用户交互以检索实例,在该片段SharedPreferences偏好的层次结构用默认的 sharedpreferences去拿值。

此外所示的偏好将遵循系统偏好视觉风格很容易创建一个层次结构鲜明的偏好,可以显示在多个屏幕上通过XML配置,由于这些原因,建议使用此片段作为一个父类的处理SharedPreferences。

PreferenceFragment偏好层次可以以多种方式形成。

@  从XML文件中指定的层次结构

@ 从不同的活动,可以指定自己的喜好 通过 XML文件的Activity meta-data中。

@从一个对象层次结构植根于preferencescreen.

使用addpreferences 加入要展现的xml, xml可以给根元素添加一个子元素,显示一个充满屏幕的preferencescreen ,其xml可以这样写。

代码示例:

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

    <PreferenceCategory
            android:title="显示一排偏好">

        <CheckBoxPreference
                android:key="checkbox_preference"
                android:title="开关"
                android:summary="@string/summary_checkbox_preference" />

    </PreferenceCategory>

    <PreferenceCategory
            android:title="这是对画框偏好">

        <EditTextPreference
                android:key="edittext_preference"
                android:title="@string/title_edittext_preference"
                android:summary="@string/summary_edittext_preference"
                android:dialogTitle="@string/dialog_title_edittext_preference" />

        <ListPreference
                android:key="list_preference"
                android:title="@string/title_list_preference"
                android:summary="@string/summary_list_preference"
                android:entries="@array/entries_list_preference"
                android:entryValues="@array/entryvalues_list_preference"
                android:dialogTitle="@string/dialog_title_list_preference" />

    </PreferenceCategory>

    <PreferenceCategory
            android:title="@string/launch_preferences">

        <!--这个标签作为一个屏幕preferencescreen打破类似于分页符在字处理像其他偏好类型我们分配一个关键在这里能够很好的保存和恢复它的实例的状态. 就是所谓的同属一个一样的类别<pre name="code" class="java" style="color: rgb(34, 34, 34); font-size: 14px; line-height: 19px;"><span style="font-family: Roboto, sans-serif;">--></span>

<PreferenceScreen android:key="screen_preference" android:title="@string/title_screen_preference" android:summary="@string/summary_screen_preference"> <!-- 你可以定义更多的Preference,将在下一个屏幕上显示.
点击的时候这个类别会充满屏幕 -->

<CheckBoxPreference android:key="next_screen_checkbox_preference" android:title="@string/title_next_screen_toggle_preference" android:summary="@string/summary_next_screen_toggle_preference" /> </PreferenceScreen> <PreferenceScreen android:title="@string/title_intent_preference"
android:summary="@string/summary_intent_preference"> <intent android:action="android.intent.action.VIEW" android:data="http://www.android.com" /> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="@string/preference_attributes">

    <!-- 可以定义一个子sp 包括自己视觉风格和主题的  以下俩个子选项属于同一个类别-->

<CheckBoxPreference android:key="parent_checkbox_preference" android:title="@string/title_parent_preference" android:summary="@string/summary_parent_preference" /> <CheckBoxPreference android:key="child_checkbox_preference" android:dependency="parent_checkbox_preference"
android:layout="?android:attr/preferenceLayoutChild" android:title="@string/title_child_preference" android:summary="@string/summary_child_preference" /> </PreferenceCategory></PreferenceScreen>


具体显示如图所示:

java 代码可以这样写;

public static class PrefsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 加载布局
        addPreferencesFromResource(R.xml.preferences);
    }
}

包含如下几个方法:

1 要指定添加一个意图可以使用:

addPreferencesFromResource (int preferencesResId)

2 每个意图可以指定清单中的元数据通过Key来获取子Preference    ,

Preference findPreference (CharSequence key)

3 获取根preferencescreen:

PreferenceScreen getPreferenceScreen ()

4 设置一个满屏的Preference

setPreferenceScreen (PreferenceScreen preferenceScreen)

其他生命会周期和activty的一模一样不做细说

3 PreferenceGroup

一种Preference的父类,如preferencecategory, preferencescreen 做基类容器。构造方法有以下三种,具体请看viewgroup的源代码 举一反三,这里不做细说

public PreferenceGroup (Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes)

Added in API level 21

public PreferenceGroup (Context context, AttributeSet attrs,
int defStyleAttr)

Added in API level 1

public PreferenceGroup (Context context, AttributeSet attrs)

4 RingtonePreference

作为铃声设置,(调用系统的铃声设置)

android:ringtoneType:响铃的铃声类型,主要有:ringtone(音乐)、notification(通知)、alarm(闹铃)(以后楼主为详细介绍alarm类)

、all(所有可用声 音类型)。

android:showDefault :默认铃声,可以使用系统(布尔值---true,false)的或者自定义的铃声

android:showSilent  :指定铃声是否为静音。指定铃声包括系统默认铃声或者自定义的铃声

5 SwitchPreference

类似左右开关的设置项,可以作为一个滑动开关

6  TwoStatePreference

有两个可选状态偏好共同基类 和SharedPreferences布尔值和可能相关的偏好,enabled 和disabled基于当前选中的状态来

通过这边文章大家可以大概了解了Preference,以后自己的应用程序的设置页面可以采用安卓自带的Preference,不仅做到和系统一样ui体验,也能方便同一管理,并且保证参数形式一致。装载请标明出处:http://blog.csdn.net/sk719887916

时间: 2024-08-26 15:03:32

安卓Preference详解的相关文章

Android进阶——Preference详解之Preference系的基本应用(三)

引言 前面一篇文章Android进阶--Preference详解之Preference系的基本应用和管理(二)介绍了二级Preference的使用和特点,接下来进入系统给我提供的底级Preference的使用CheckBox选择项CheckBoxPreference.EditText编辑对话框EditTextPreference.列表选择ListPreference.多项选择MultiSelectListPreference. 开关选择SwitchPreference的应用和管理.以期大家能在学

Android进阶——Preference详解之Preference系的基本应用和管理(二)

引言 前面一篇文章Android进阶--Preference详解之初识Preference及Preference系(一)简单描述下了Preference的家族构成和基本知识,相信对于Preference早已不会陌生,肯定也跃跃欲试了吧,这篇文章就给大家总结下Preference.PreferenceActivity.PreferenceGroup.RingtonePreference的普通应用和管理,还有通过一些测试来验证一些机制和原理. 一.PreferenceActivity 1.Prefe

安卓权限详解

添加WiFi以及访问网络的权限:    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission>    <

安卓Zygote详解

一.Zygote, 意为"受精卵",Android系统中几乎所有的应用进程都是由Zygote进程孵化出来的,Java环境也是由Zygote创建起来的,它建立了我们app运行所需要的环境,是app的祖先,因此,分析它的启动以及内部逻辑显得非常有必要. *Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的.Zygote进程也不例外,它是在系统启动的过程,由init进程创建的

Android数据存储(二)----PreferenceFragment详解

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4020469.html 联系方式:[email protected] [正文] 一.PreferenceFragment的引入: PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存.Android专门为

Android Preference存储、res/raw、asset、openFileOutput、sdcard存储、Cache详解

*res/raw.assets.其它存储的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. 两者都是只读,是不能存储数据的目录. 相同都可以放文件. *res/raw.assets.其它存储的不同点: res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. res/raw不可以有目录结构,而assets则可以有目

安卓集成发布详解(二)gradle

转自:http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/ 安卓集成发布详解(二) 15 Jun 2015 上一篇主要讲了安卓版本编译版本发布的过程,本篇主要写版本编译脚本的实现,包括签名文件处理及多渠道版本编译.安卓集成发布详解(一) 一.签名部分编写 gradle本身支持直接签名,只需要在releas部分添加如下代码即可 signingConfigs { debug { } releas

Android自定义View【实战教程】5??---Canvas详解及代码绘制安卓机器人

友情链接: Canvas API Android自定义View[实战教程]3??--Paint类.Path类以及PathEffect类详解 神马是Canvas 基本概念 Canvas:可以理解为是一个为我们提供了各种工具的画布,我们可以在上面尽情的绘制(旋转,平移,缩放等等).可以理解为系统分配给我们一个一个内存空间,然后提供了一些对这个内存空间操作的方法(API), 实际存储是在下面的bitmap. 两种画布 这里canvas可以绘制两种类型的画图,分别是view和surfaceView. V

安卓 Intent 与/intent-filter的关系详解。

Intent可以分为两种:显式Intent和隐式Intent;显式Intent:通过组件名字字段指定目标组件;因为开发者通常不知道其它应用程序的组件名字,所以,显式Intent通常用于应用程序内部消息传递;例如:一个Activity启动从属的服务或启动一个同级别的Activity;隐式Intent:不指定目标组件的名字(组件名字字段是空);隐式Intent经常用于激活其它应用程序中的组件;Android系统传递一个显式Intent消息对象到一个指定目标组件名字的实例,Intent消息对象中只用组