我想大家对于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的更多相关文章

  1. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面

    随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager  类,用 ...

  2. Android编程 获取网络连接状态 及调用网络配置界面

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

  3. Android编程获取网络连接状态及调用网络配置界面

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

  4. Win10下Android studio配置

    Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ...

  5. [Android] 环境配置之正式版Android Studio 1.0

    昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...

  6. 【Android】配置APK开发环境

    1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/dow ...

  7. [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)

    [Android] 环境配置之基础开发环境(SDK/Android Studio)   博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...

  8. Kotlin【简介】Android开发 配置 扩展

    重要资源 官方资源:官网 . 官网源码 .官网文档 . 在线 IDE .GitHub 中文资源:中文官网 .中文文档  离线文档:PDF 文件 . PDF 文件 GitBook 版 .ePUB 文件  ...

  9. [Android] 环境配置之Android Studio开发NDK

    分类:Android环境搭建 (14351)  (20) ========================================================作者:qiujuer博客:bl ...

随机推荐

  1. iOS 图片填充 UIImageView

    UIViewContentModeScaleAspectFit,     //这个图片都会在view里面显示,并且比例不变  这就是说 如果图片和view的比例不一样 就会有留白如下图1 UIView ...

  2. CSS中IE8和chrom像素百分比计算差异

    IE8中和chrome在计算像素百分比上,IE8舍一位取元素像素大小,chrome则使用四舍五入取元素像素大小: 比如:<body><div stype=“width:30%”> ...

  3. The Promise of Deep Learning

    The Promise of Deep Learning By Yoshua Bengio Humans have long dreamed of creating machines that thi ...

  4. Jar包可执行??

    第一次听说,jvm加载包,必须rwx么?

  5. 找到个好的讲PYTHON FILE IO的文档,收藏

    现在我感觉快入门了哈, 这两天,可以用PYTHON写一点自己想要实现的东东了. 但文件,IO,编码,邮件,始终有点续不完全. 这个文档,我看行.. http://www.dabeaz.com/pyth ...

  6. Hibernate save或者persist 后获取主键ID

    一个自增长ID的对象被save或者persist后,会返回其主键ID: Department department = new Department(); department.setName(&qu ...

  7. Bridge实现

    网桥原理: 传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的. 这样,网络资源被极大的浪费掉了. 网桥之所以不同于 ...

  8. Ehcache详细解读(转)

    Ehcache 是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料 以简单介绍和配置方法居多,如果你有这方 ...

  9. Binomial Showdown

    Binomial Showdown TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Totalsubmit: 2323   Accepted: 572 D ...

  10. Eclipse无法识别Android真机的解决方法

    使用IORegistryExplorer(在Developer Tool)可以查看连接上的USB设备的信息.选择IOUSB,可以看到名为连线的安卓设备,比如小米idVendor是0x2717. ech ...