详解Android首选项框架的使用实例

首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。

Android提供了一种健壮并且灵活的框架来处理首选项。它提供了简单的API来隐藏首选项的读取和持久化,并且提供了一个优雅的首选项界面。

首先,我们来看下面这款软件的首选项界面:

这款软件使用了好几种类型的首选项,每一种首选项都有其独特的用法,下面我们来了解一下几种常见的首选项:

CheckBoxPreference:用来打开或关闭某个功能 ListPreference:用来从多个选项中选择一个值; EditTextPreference:用来配置一段文字信息; Preference:用来执行相关的自定义操作(上图中的清除缓存、历史记录、表单、cookie都属于此项); RingtonePreference:专门用来为用户设置铃声。

当我们使用首选项框架时,用户每更改一项的值后,系统就会立即在/data/data/[PACKAGE_NAME]/shared_prefs下生成一个[PACKAGE_NAME]_preferences.xml的文件,文件会记录最新的配置信息。

那么如何使用首选想框架呢?我们需要以下几步操作:

1.建立一个首选项的xml配置文件,放在项目的/res/xml目录下面;

2.新建一个Activity,继承android.preference.PreferenceActivity,然后在onCreate方法中加载我们的首选项配置文件。

下面,我就为大家演示一下首选项框架的配置和使用:

我们新建一个prefs项目,项目结构如下:

我们要实现的功能跟上面那款软件的很相似,下面我来说明一下这个项目的整体流程:

1.主界面。显示用户昵称,有三个参数,昵称文字、字体大小和背景颜色。首次进入时,使用默认值。

2.按下menu键中的settings项,跳转到首选项页面,进行参数选择。

3.按下返回键,返回主界面,设定后的参数生效。

首先,让我们来看一下主界面的配置文件,非常简单,就一个TextView:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:textColor="#FF0000"/> </LinearLayout>

然后,我们需要在主界面里根据配置参数设置TextView的外观以及背景,MainActivity.java代码如下:

package com.scott.prefs; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends Activity { private static final int SETTINGS_ID = 0; private static final int EXIT_ID = 1; private TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); showSettings(); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, SETTINGS_ID, 0, "Settings"); menu.add(0, EXIT_ID, 0, "Quit"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == SETTINGS_ID) { Intent intent = new Intent(MainActivity.this, PrefsActivity.class); //如果requestCode >= 0 则返回结果时会回调 onActivityResult()方法 startActivityForResult(intent, 1); } else { finish(); } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); showSettings(); } private void showSettings() { String prefsName = getPackageName() + "_preferences"; //[PACKAGE_NAME]_preferences SharedPreferences prefs = getSharedPreferences(prefsName, Context.MODE_PRIVATE); String nickName = prefs.getString("nickName", "机器人"); textView.setText("欢迎您:" + nickName); boolean nightMode = prefs.getBoolean("nightMode", false); textView.setBackgroundColor(nightMode ? Color.BLACK : Color.WHITE); String textSize = prefs.getString("textSize", "0"); if (textSize.equals("0")) { textView.setTextSize(18f); } else if (textSize.equals("1")) { textView.setTextSize(22f); } else if (textSize.equals("2")) { textView.setTextSize(36f); } } }

可以看到,进入主界面之后会根据[PACKAGE_NAME]_preferences获取首选项配置信息,如果是首次进入,则使用默认值,下面就是我们首次进入主界面时的画面:

可以看到,我们初次进入的界面时昵称为“机器人”,字的背景为白色,字的大小为18号。

然后按下Settings之后,我们就可以进行首选项的配置了,让我们先来看一下settings.xml的配置:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="settings" android:title="软件设置"> <PreferenceCategory android:key="basic" android:title="基本设置"> <EditTextPreference android:key="nickName" android:title="昵称" android:defaultValue="机器人"/> <CheckBoxPreference android:key="nightMode" android:title="夜间模式" android:summaryOn="已启用" android:summaryOff="未启用"/> <ListPreference android:key="textSize" android:title="文字大小" android:dialogTitle="文字大小" android:entries="@array/textSize_entry" android:entryValues="@array/textSize_entry_value" android:defaultValue="0"/> </PreferenceCategory> <PreferenceCategory android:key="clean" android:title="清除记录"> <Preference android:key="cleanHistory" android:title="清除历史记录" /> </PreferenceCategory> </PreferenceScreen>

其中,最外层是PreferenceScreen标签,代表一系列首选项的集合;然后,我们注意到PreferenceCategory这一项,此标签代表一个类别,可以包含多个首选项;最后就是我们用于配置参数的首选项了。需要了解的是,PreferenceScreen也可以嵌套使用,也就是说上面的PreferenceCategory可以替换成PreferenceScreen。

此外,我们还需要了解一下文件中出现的几个常用标签属性:

android:key  选项的名称或键 android:title  选项的标题 android:summary  选项的简短摘要 android:entries  列表项的文本 android:entryValues  列表中每一项的值 android:dialogTitle  对话框标题 android:defalutValue  列表中选项的默认值 对于CheckBoxPreference还有两个特殊的属性 android:summaryOn  选项被选中时显示的摘要 android:summaryOff  选项未选中时显示的摘要

我们还可以看到,在ListPreference中,entries来自于textSize_entry,而entryValues来自于textSize_entry_value,这两项都在/res/values目录下的text_size.xml配置:

<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="textSize_entry"> <item>小</item> <item>中</item> <item>大</item> </string-array> <string-array name="textSize_entry_value"> <item>0</item> <item>1</item> <item>2</item> </string-array> </resources>

配置完成之后,我们就剩下最后一步了,创建Activity,继承PreferenceActivity,加载首选项资源文件,处理相应的选项事件。

PrefsActivity.Java代码如下:

package com.scott.prefs; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.widget.Toast; public class PrefsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener { private EditTextPreference nickName; private ListPreference textSize; private Preference cleanHistory; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setttings); nickName = (EditTextPreference) findPreference("nickName"); textSize = (ListPreference) findPreference("textSize"); cleanHistory = findPreference("cleanHistory"); //为nickName和textSize注册Preference.OnPreferenceChangeListener监听事件 //当值更改时我们可以立即更新summary nickName.setOnPreferenceChangeListener(this); textSize.setOnPreferenceChangeListener(this); initSummary(); } //初始化summary private void initSummary() { nickName.setSummary(nickName.getText()); setTextSizeSummary(textSize.getValue()); } private void setTextSizeSummary(String textSizeValue) { if (textSizeValue.equals("0")) { textSize.setSummary("小"); } else if (textSizeValue.equals("1")) { textSize.setSummary("中"); } else if (textSizeValue.equals("2")) { textSize.setSummary("大"); } } /** * 重写PreferenceActivity的onPreferenceTreeClick方法 * 在首选项被点击时 做出相应处理操作 */ @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == cleanHistory) { new AlertDialog.Builder(this) .setTitle("清除历史记录") .setMessage("是否真的要清除历史记录?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //cleaning history... Toast.makeText(PrefsActivity.this, "清除成功", Toast.LENGTH_SHORT).show(); } }).setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create().show(); } return true; } /** * 重写Preference.OnPreferenceChangeListener的onPreferenceChange方法 * 当首选项的值更改时 做出相应处理操作 */ @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == nickName) { nickName.setSummary(newValue.toString()); } else if (preference == textSize) { setTextSizeSummary(newValue.toString()); } return true; } }

最后,别忘了在AndroidManifest.xml中加入此Activity配置信息:

<activity android:name=".PrefsActivity"/>

当然我们也可以配置一下<intent-filter></intent-filter>属性。

经过以上几步,我们的首选项配置就完成了,首次进入的界面如下:
然后我们分别更改昵称、夜间模式、文字大小,如下:
可以看到,当我们更改了选项的值之后,摘要部分已经设置为最新值了,此时在我们应用下的shared_prefs目录中生成一个com.scott.prefs_preferences.xml文件,如图:

内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="nightMode" value="true" /> <string name="nickName">scott</string> <string name="textSize">2</string> </map>

此时,我们按回退键,回到主界面,发现刚才的设置已经生效了:

可以看到,昵称已经更改成“scott”,字的背景已更改为黑色,字的大小已更改为36号。

如果我们在首选项界面按下清除历史记录一项,将会出现一下界面:

原文链接:http://blog.csdn.net/liuhe688/article/details/6448423

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-16 05:20:59

详解Android首选项框架的使用实例的相关文章

详解Android首选项框架的使用实例_Android

首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数. Android提供了一种健壮并且灵活的框架来处理首选项.它提供了简单的API来隐藏首选项的读取和持久化,并且提供了一个优雅的首选项界面. 首先,我们来看下面这款软件的首选项界面: 这款软件使用了好几种类型的首选项,每一种首选项都有其独特的用法,下面我们来了解一下几种常见的首选项: CheckBoxPreference:用来打开或关闭某个功能 ListPreference:用来从多个选项中选择一个值: E

基于 SurfaceView 详解 android 幸运大转盘,附带实例app

基于 SurfaceView 详解 android 幸运大转盘,附带实例app       首先说一下,幸运大转盘,以及SurfaceView是在看了也为大神的博客,才有了比较深刻的理解,当然这里附上这位大神的博客地址:博客地址,有兴趣的话你可以去看看,里面有很多的例子.至于我为什么要写这篇博客?,原因之一:加强自己的理解,原因之二:大神的博客就是大神的博客,跳转的太快,基础不好的,很难理解.还有就是一天在实验室太无聊了,没事写写东西.这里我再来更加基础的分析一下.写的不好,原谅.有什么写的不对

详解Android控件状态依赖框架

在生产型Android客户端软件(企业级应用)开发中,界面可能存在多个输入(EditText)和多个操作(MotionEvent和KeyEvent),且操作依赖于输入的状态.如下图所示的场景: 设定图中 确认操作依赖于商品编码和储位的状态 跳过操作不依赖于输入状态 登记差异操作依赖于储位和数量的状态 输入框有三种状态: 待输入: 待校验: 校验成功. 操作需要当其依赖的输入数据校验成功,才能执行. 如果在Activity中去判断输入框状态,那么实际需要调用(3个输入框)*(3种状态)*(3个按钮

详解Android的MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验,同时修改了官方教程的一些错误,每一个知识点都有对应的源码,争取做到实践与理论相结合. Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性.其实在此之前,已经有些第三方的框架可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来. 准备 Android Studio 更新到 1.3

详解Android主流框架不可或缺的基石

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

详解Java的Struts框架中上传文件和客户端验证的实现_java

文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的目录,以确保数据不丢失. 请注意,服务器有一个安全策略可能会禁止写到目录以外的临时目录和属于web应用的目录. 在Struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.interceptor.FileUploadInterceptor类的defaultStack

详解Java的Struts框架以及相关的MVC设计理念_java

struts简介Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品. Struts发展历史 Struts是作为ApacheJakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServerPages.servlet.标签库以及面向

详解Android中Intent对象与Intent Filter过滤匹配过程_Android

如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

详解Android中Handler的内部实现原理_Android

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功