Android的配置界面PreferenceActivity
我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了。


从上述界面中(其实是一个界面),我们可以看到有2组元素,第一组为:自动更新,更新频率。第二组为:是否登录,账号,密码。
其实分组是为了方便管理而已。这里主要使用到了选择,列表,编辑框等Preference.
我们还是来温习下基础知识吧。
一.基础知识
通常我们开发一个程序时,会需要给用户提供一个设置界面,使用户可以对程序的一些参数进行设置。通常我们使用Preferences的键值对存储方式,来对Android数据持久化。
android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种方式可以获取系统中持久化的数据,这些数据时存放在.xml中的:
1:public SharedPreferences getPreferences (int mode),只隶属于activity对象,并以这个对象为文件名。
2:public SharedPreferences getSharedPreferences (String name, int mode),隶属于整个应用,以name名称保存。
3:public static SharedPreferences getDefaultSharedPreferences (Context context),隶属于整个应用,保存PreferenceActivity中的设置,根据包名和PreferenceActivity的布局文件来起一个名字保存。
SharedPreferences可以保存Boolean、Int、Float、Long、String等类型。一般是SharedPreferences.Editor的putXXX()方法保存,并commit()方法提交;或者是remove(),方法移除,clear()方法清空,当然操作完毕后需要commit()方法提交。
一般的,可以使用SharedPreferences保存持久化数据,比如登陆账号,密码,以及相对固定设置参数等等,看你应用需要。
既然使用到设置参数界面,那么我们可以来认识下一下几个类标签:
1:PreferenceScreen 持久化设置界面的顶级容器,代表一屏,里面可以嵌套屏幕,嵌套的时候可以点击跳转到另外一屏。
2:PreferenceCategory 当前屏的分组容器,说白了,就是为了划分组而已。
3:CheckBoxPreference,ListPreference,EditTextPreference等等组件。这些都是常见的对应上述的选择标签、列表标签、编辑标签。
上述组件都有titile,summary,key属性。title标题描述,summary:详细描述,key:保存SharedPreferences时候的键。
二.实战
既然有了上述基础知识后,我们就可以来做如上的设置界面了,在上述界面中,我们知道当前配置界面只需一屏,没有额外的跳转,那么需要PreferenceScreen,不需要嵌套其他PreferenceScreen,而设置界面分为两栏,那么需要两个PreferenceCategory,并且这个PreferenceCategory可以设置标题。同时根据界面,我们还需要CheckBoxPreference,ListPreference,EditTextPreference等。操作如图:


当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在xml文件夹中,如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/setting" >
<PreferenceCategory android:title="@string/update" >
<CheckBoxPreference
android:key="@string/update_key"
android:summaryOn="@string/auto_update_switch_summary_on"
android:summaryOff="@string/auto_update_switch_summary_off"
android:summary="@string/auto_update_setting"
android:title="@string/auto_update_switch_title"
android:defaultValue="true"
/>
<ListPreference
android:key="@string/auto_update_frequency_key"
android:dialogTitle="@string/auto_update_frequency_title"
android:entries="@array/auto_frequency_name"
android:entryValues="@array/auto_frequency_value"
android:negativeButtonText="@string/cancel"
android:summary="@string/auto_update_frequency_summary"
android:title="@string/auto_update_frequency_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/other" >
<CheckBoxPreference
android:key="@string/isneilflag_key"
android:title="@string/isneilflag"
android:disableDependentsState="true"
/>
<EditTextPreference
android:dependency="@string/isneilflag_key"
android:key="@string/username_key"
android:summary="@string/username_summary"
android:title="@string/username" />
<EditTextPreference
android:dependency="@string/isneilflag_key"
android:key="@string/password_key"
android:summary="@string/password_summary"
android:title="@string/password" />
</PreferenceCategory>
</PreferenceScreen>
当然这里使用到了一些文件,代码一并释放:
<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="hello">Hello World, PreferenceActivityDemoActivity!</string>
<string name="app_name">PreferenceActivityDemo</string>
<string name="cancel">取消</string>
<string name="other">其他</string>
<string name="setting">设置</string>
<string name="update">更新</string>
<string name="auto_update_switch_title">自动更新</string>
<string name="auto_update_setting">自动更新设置</string>
<string name="auto_update_switch_summary_on">开启自动更新</string>
<string name="auto_update_switch_summary_off">关闭自动更新</string>
<string name="auto_update_frequency_title">更新频率</string>
<string name="auto_update_frequency_summary">设置更新周期</string> <string name="isneilflag">是否匿名登录</string>
<string name="username">帐号</string>
<string name="password">密码</string>
<string name="username_summary">提供您帐号</string>
<string name="password_summary">提供您密码</string> <string name="update_key">update_key</string>
<string name="auto_update_frequency_key">auto_update_frequency_key</string>
<string name="isneilflag_key">isneilflag_key</string>
<string name="username_key">username_key</string>
<string name="password_key">password_key</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="auto_frequency_name">
<item>10分钟</item>
<item>30分钟</item>
<item>1小时</item>
<item>12小时</item>
</string-array> <string-array name="auto_frequency_value">
<item>10</item>
<item>30</item>
<item>60</item>
<item>720</item>
</string-array>
</resources>
接下来,我们就来解释下xml文件夹中设置文件的一些内容吧:
android:key="@string/update_key" 这个是我们持久化时SharedPreferences保存的键,
android:summaryOn="@string/auto_update_switch_summary_on" 选中后显示内容
android:summaryOff="@string/auto_update_switch_summary_off" 未选中后显示内容
android:summary="@string/auto_update_setting" 平常状态显示内容
android:title="@string/auto_update_switch_title" 标题
android:defaultValue="true" 默认值
android:dialogTitle="@string/auto_update_frequency_title" 对话框标题
android:entries="@array/auto_frequency_name" 列表项显示名称
android:entryValues="@array/auto_frequency_value" 列表项值
android:disableDependentsState="true" 当CheckBoxPreference的值为真的时候,禁用依赖于该设置的其他设置项。
android:dependency="@string/isneilflag_key" 根据上述设置依赖于CheckBoxPreference的真值进行启用与禁用。
注意:我们可以从上图知道ListPreference是继承之Preference,以及DialogPreference的,那么就有它们的属性以及方法了。
好了,设置界面已经定义完成,我们来定义一个activity继承之PreferenceActivity,并使之显示吧。
当然噩梦可以再使之继承接口OnPreferenceChangeListener,OnPreferenceClickListener,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数。
具体代码如下:
package com.dongzi; import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
import android.preference.PreferenceActivity;
import android.util.Log;
public class PreferenceActivityDemoActivity extends PreferenceActivity
implements OnPreferenceChangeListener,OnPreferenceClickListener{
static final String TAG="PreferenceActivityDemoActivity";
SharedPreferences preference=null;
CheckBoxPreference updateCheckBoxPreference=null;
ListPreference lististPreference=null;
CheckBoxPreference isneilflag_CheckBoxPreference=null;
EditTextPreference usernameEditTextPreference=null;
EditTextPreference passwordEditTextPreference=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置显示Preferences
addPreferencesFromResource(R.xml.preference);
//获得SharedPreferences
preference=PreferenceManager.getDefaultSharedPreferences(this); //找到preference对应的Key标签并转化
updateCheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.update_key));
lististPreference=(ListPreference)findPreference(getString(R.string.auto_update_frequency_key));
isneilflag_CheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.isneilflag_key));
usernameEditTextPreference=(EditTextPreference)findPreference(getString(R.string.username_key));
passwordEditTextPreference=(EditTextPreference)findPreference(getString(R.string.password_key));
//为Preference注册监听
updateCheckBoxPreference.setOnPreferenceChangeListener(this);
updateCheckBoxPreference.setOnPreferenceClickListener(this); lististPreference.setOnPreferenceClickListener(this);
lististPreference.setOnPreferenceChangeListener(this); isneilflag_CheckBoxPreference.setOnPreferenceChangeListener(this);
isneilflag_CheckBoxPreference.setOnPreferenceClickListener(this); usernameEditTextPreference.setOnPreferenceChangeListener(this);
passwordEditTextPreference.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
//判断是哪个Preference改变了
if(preference.getKey().equals(getString(R.string.update_key))){
Log.e(TAG, getString(R.string.update_key));
}else if(preference.getKey().equals(getString(R.string.isneilflag_key))){
Log.e(TAG, getString(R.string.isneilflag_key));
}
//返回true表示允许改变
return true;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//判断是哪个Preference改变了
if(preference.getKey().equals(getString(R.string.username_key))){
//账号
Log.e(TAG, getString(R.string.username_key));
}else if(preference.getKey().equals(getString(R.string.password_key))){
//密码
Log.e(TAG, getString(R.string.password_key)); }else if(preference.getKey().equals(getString(R.string.auto_update_frequency_key))){
//列表
Log.e(TAG, getString(R.string.auto_update_frequency_key));
}
//返回true表示允许改变
return true;
}
}
从上述代码可知:
1:设置显示Preferences可以调用方法addPreferencesFromResource(R.xml.preference); 传递preference文件即可。
2:然后通过findPreference();方法找到键的类标签
3:我们定义2个监听接口监听参数是否设置成功。
4:在监听接口中返回true就是设置允许提交。
结果打印如下:

成功!
也许你会问,我们这里并没有使用
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
settings.getXXXX();settings.putXXXX();以及commit()等方法,设置、获取并提交值啊?!是的,在这里我们不需这样,因为
当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。
当然,您可以在其他界面使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);等类方法来获取数据,看能不能获取到
Android的配置界面PreferenceActivity的更多相关文章
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用 ...
- Android编程 获取网络连接状态 及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Android编程获取网络连接状态及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Win10下Android studio配置
Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ...
- [Android] 环境配置之正式版Android Studio 1.0
昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...
- 【Android】配置APK开发环境
1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/dow ...
- [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)
[Android] 环境配置之基础开发环境(SDK/Android Studio) 博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...
- Kotlin【简介】Android开发 配置 扩展
重要资源 官方资源:官网 . 官网源码 .官网文档 . 在线 IDE .GitHub 中文资源:中文官网 .中文文档 离线文档:PDF 文件 . PDF 文件 GitBook 版 .ePUB 文件 ...
- [Android] 环境配置之Android Studio开发NDK
分类:Android环境搭建 (14351) (20) ========================================================作者:qiujuer博客:bl ...
随机推荐
- AFNetworking的原理与基本使用-b
全称是AFNetworking 虽然运行效率没有ASI高,但是使用比ASI简单 是对NSURLConnection和NSURLSession的各自的一层包装 AFN的内部中的RunLoop AFN内部 ...
- C# 两个获得程序运行路径的函数
EXE文件的存储路径,不太受调用时环境变量的影响: Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Lo ...
- smarty 比较运算符对照表
smarty 比较运算符对照表 运算符 中文解释 eq 相等 ne.neq 不相等 gt 大于 lt 小于 gte.ge 大于等于 lte.le 小于等于 not 非 mod 求模 is [not] ...
- [topcoder]KingdomReorganization
http://community.topcoder.com/stat?c=problem_statement&pm=11282&rd=14724 这道题是最小生成树,但怎么转化是关键. ...
- UNIX网络编程——套接字选项
http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...
- PCB 敷铜间距规则(转)
第一优先规则: First Object = InPolygon, Second Object = All 第二优先规则:First Object = All, Second Object = All ...
- Android ListView内容变化后的动态刷新
ListView内容变化后的动态刷新 基本知识点: 1.更新适配器Adapter数据源 2.调用适配器Adapter的刷新方法notifyDataSetChanged() 首先需要定义ListView ...
- andriod系统裁剪心得
亲们,,有人做过 将android系统总内存减少,并保持系统的稳定运行 方面的么?...比如将512M的内存换成256M,系统依然稳定运行,, 我目前,从三个方面下手,,,1.删减系统中不需要使用的a ...
- oracle core04_undo
undo信息 oracle中undo的信息主要完成下面的功能: 1,构建块一致性读 2,回滚事务 UBA:undo block address 1,块中的事务槽ITL中的UBA表示这个ITL所在的bl ...
- Apache / PHP 5.x Remote Code Execution Exploit
测试方法: 本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! /* Apache Magica by Kingcope */ /* gcc apache-magika.c -o ...