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可以保存BooleanIntFloatLongString等类型。一般是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可以设置标题。同时根据界面,我们还需要CheckBoxPreferenceListPreference,EditTextPreference等。操作如图:

 

 

当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在xml文件夹中,如下:

View Code
<?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>

当然这里使用到了一些文件,代码一并释放:

View Code
<?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>
View Code
<?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进行了点击或者改变的操作时,都会回调接口中的函数。

具体代码如下:

View Code
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);等类方法来获取数据,看能不能获取到

 

<linker : http://www.cnblogs.com/zhangdongzi/archive/2012/01/05/2313519.html>

 

 

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3338547.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas(数据分析处理库)---讲解

本内容来自《跟着迪哥学Python数据分析与机器学习实战》&#xff0c;该篇博客将其内容进行了整理&#xff0c;加上了自己的理解&#xff0c;所做小笔记。若有侵权&#xff0c;联系立删。 迪哥说以下的许多函数方法都不用死记硬背&#xff0c;多查API多看文档&#xff0c;确实&a…

hdu 1141

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1141 题意&#xff1a;atmel公司1960年发布4bits的处理器&#xff0c;每10年翻一番。给一个年份&#xff0c;问最近一次发布的处理器能运算的n!最大的n是多少。 mark&#xff1a;最大的处理器位数是2160年的4194304…

leetcode 78. 子集 思考分析

题目 给定一组不含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 思考分析 画出解空间树。 我们可以发现我们所需要的结果是解空间的所有结点。而我们之前组合问题和分割问题都是…

PHP checkdate()函数与示例

PHP checkdate()函数 (PHP checkdate() function) checkdate() function is used to check the valid Gregorian dates. It accepts the date and returns Boolean values (True/False) based on the date values. checkdate()函数用于检查有效的公历日期。 它接受日期&#xf…

设计模式读书笔记-----备忘录模式

个人比较喜欢玩单机游戏&#xff0c;什么仙剑、古剑、鬼泣、使命召唤、三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传)&#xff0c;对于这些游戏除了剧情好、场面大、爽快之外&#xff0c;还可以随时存档&#xff0c;等到下次想玩了又可以从刚开始的位置玩起(貌似现在的…

【C++grammar】vector类和字符串字面量

C的vector类 用数组存放数据时&#xff0c;容量大小不可变&#xff0c;vector对象容量可自动增大。 vector的操作&#xff1a; 调用push_back函数时&#xff0c;vector对象的容量可能会增大。 观察下列操作对vector的影响&#xff1a; #include <vector> #include <…

除去数组中的空字符元素array_filter

<?php$str1_arrayarray(电影,,http://www,,1654,);$str1_arrayarray_filter($str1_array);print_r($str1_array); ?>显示结果&#xff1a;Array( [0] > 电影 [2] > http://www [4] > 1654) 转载于:https://www.cnblogs.com/skillCoding/archive/20…

date.after方法_Java Date after()方法与示例

date.after方法日期类after()方法 (Date Class after() method) after() method is available in java.util package. after()方法在java.util包中可用。 after() method is used to check whether this date is after the given date (d) or not. after()方法用于检查此日期是…

Matplotlib(数据可视化库)---讲解

本内容来自《跟着迪哥学Python数据分析与机器学习实战》&#xff0c;该篇博客将其内容进行了整理&#xff0c;加上了自己的理解&#xff0c;所做小笔记。若有侵权&#xff0c;联系立删。 迪哥说以下的许多函数方法都不用死记硬背&#xff0c;多查API多看文档&#xff0c;确实&a…

找min和max

看到的貌似是阿里的笔试题&#xff0c;题意是一组数&#xff0c;要找到min和max&#xff0c;同时要求时间复杂度&#xff08;比较次数&#xff09;小于2n&#xff08;2n的办法都想得到&#xff09;。 别人的思路&#xff1a;n个数的数组里看作每两个一组&#xff0c;若n是奇数&…

Shader Compiler 界面进展1

先从模仿Composer的界面开始. 目前的进展:不用不知道,虽然wxweidgets有很多界面工具如DialogBlocks(DB), 但仍然不好使. 我使用wxAui界面, DialogBlocks并不支持输出其xrc格式, 我猜是wx本身就没有解析wxAui的xrc格式.像wxAuiToolBar或其他wxToolBar, DB工具也不能独立输出xrc.…

leetcode 90. 子集 II 思考分析

与本题相关联的题目解析&#xff1a; leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 思考 …

java bitset_Java BitSet and()方法与示例

java bitsetBitSet类和()方法 (BitSet Class and() method) and() method is available in java.util package. and()方法在java.util包中可用。 and() method is used to perform logical AND between two Bitset. This bit set is updated so that every bit holds the value…

Redis-主从复制

一、Redis的Replication&#xff1a; 这里首先需要说明的是&#xff0c;在Redis中配置Master-Slave模式真是太简单了。相信在阅读完这篇Blog之后你也可以轻松做到。这里我们还是先列出一些理论性的知识&#xff0c;后面给出实际操作的案例。 下面的列表清楚的解释了Redis…

.wav音乐文件转换为.fft.npy频谱格式文件

需要修改的地方 十个文件夹&#xff0c;每个文件夹下都有100首.au格式的音乐&#xff0c;这里举个例子&#xff0c;那其中5个类别进行转换 genre_list ["classical", "jazz", "country", "pop", "rock", "metal"…

WINDOWS编程笔记 2012.2.7

操作系统感知事件和传递事件是通过消息机制来实现的typedef struct tagMSG{ HWND hwnd; //窗口的句柄 UINT message; WPARAM wParam; //信息的附加参数 LPARAM lParam; DWORD time; //消息传递的时间 POINT pt; //消息投递的时候&#xff0c;光标的位置}…

php 邮件验证_PHP程序来验证电子邮件地址

php 邮件验证Suppose there is a form floating where every user has to fill his/her email ID. It might happen that due to typing error or any other problem user doesnt fill his/her mail ID correctly. Then at that point, the program should be such that it sho…

【C++grammar】结构化绑定

目录定义1、用于原生数组的结构化绑定声明2、用于std::array的结构化绑定声明3、用于对象数据成员的结构化绑定声明定义 结构化绑定声明是一个声明语句&#xff0c;意味着声明了一些标识符并对标识符做了初始化。将指定的一些名字绑定到初始化器的子对象或者元素上。 对于初始…

URAL 1106 Two Teams (DFS)

题意 小组里有N个人&#xff0c;每个人都有一个或多个朋友在小组里。将小组分成两个队伍&#xff0c;每个队伍的任意一个成员都有至少一个朋友在另一个队伍。 思路 一开始觉得和前几天做过的一道2-sat&#xff08;每个队伍任意两个成员都必须互相认识&#xff09;相似然后就往那…

七、逻辑回归项目实战---音乐分类器

一、项目需求 训练集数据为六类音乐([“classical”, “jazz”, “country”, “pop”, “rock”, “metal”])&#xff0c;格式为.wav&#xff0c;每类音乐都有100首 音乐分类器项目&#xff0c;主要运用到了傅里叶变换函数 很多东西越在高维空间处理起来就会变得越是简单 例…