文档章节

PreferenceActivity相关学习

wanyang
 wanyang
发布于 2014/07/11 14:07
字数 1405
阅读 52
收藏 1

在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。 
为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。 

PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。 

1.MainActivity: 
按下Menu按键弹出菜单,点击菜单启动SettingActivity。 
2.SettingActivity继承自PreferenceActivity: 

Java代码  收藏代码

  1. @Override  

  2.     protected void onCreate(Bundle savedInstanceState) {  

  3.         super.onCreate(savedInstanceState);  

  4.         addPreferencesFromResource(R.xml.settings);  

  5.     }  


在onCreate函数中加载参数定义文件。 

Java代码  收藏代码

  1. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);  


当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。 

Java代码  收藏代码

  1. Preference android.preference.PreferenceActivity.findPreference(CharSequence key);  


获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。 
3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="utf-8"?>  

  2.     <PreferenceScreen  

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

  4.     </PreferenceScreen>  


添加一个CheckBoxPreference子项,并设置属性: 
Key:checkbox_key 
Title:CheckBox Item 
Summary:test check box item 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="utf-8"?>  

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

  3.     <CheckBoxPreference android:key="checkbox_key"  

  4.         android:title="CheckBox Item" android:summary="test check box item"></CheckBoxPreference>  

  5.     </PreferenceScreen>  


key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容: 

Xml代码  收藏代码

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  

  2.     <map>  

  3.         <boolean name="checkbox_key" value="true" />  

  4.     </map>  


启动Ap,点击菜单,即可看到参数设置界面,并且当用户点击操作改变了参数值后,也会被自动保存。 
4.使用参数值: 
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
        boolean check_test = sp.getBoolean("checkbox_key", false); 

进阶: 
1.保存参数文件的路径: 
/data/data/包名/shared_prefs/包名_preferences.xml 
如果想指定保存文件名,可使用: 
getPreferenceManager().setSharedPreferencesName("配置文件名"); 
2.其他的参数配置项: 
2.1 EditTextPreference: 

Xml代码  收藏代码

  1. <EditTextPreference android:dialogTitle="Edit Text Dialog"  

  2.         android:key="edittext_key" android:dialogMessage="Please Input text"  

  3.         android:title="EditText Item" android:summary="test edittext item"></EditTextPreference>  


此参数设置项会弹出一个文本输入对话框,并在配置文件中生成类似以下内容: 
<string name="edittext_key">this is a good text</string> 
弹出对话框的图标、标题、提示信息、Icon、以及两个按钮的文本都可以设定。 
至于自定义对话框的布局,虽然有这个属性,但是自定义布局后就不能自动保存值了, 
本来以为只要放一个ID和原来一样的EditText就能,但是查看源代码,发现其EditText是new出来的,没法替代。 
2.2 PreferenceCategory:一个分类分隔条。只有title属性有效。 
2.3 PreferenceScreen:此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。 
2.4 ListPreference:会弹出一个列表对话框供选择。 
2.5 RingtonePreference:会弹出系统铃声列表供选择。 
2.6 Preference:通用参数项。点击后需要程序自己响应事件。 
3.自定义选项: 
系统的提供的界面有时不能满足需要,这时就需要自定义选项了。 
有两种方法可以实现自定义选项,一是用Preference作为选项,并重新实现onPreferenceTreeClick函数。 
一是自定义一个类,类似于EditTextPreference这种系统内置的类,然后引用。 
3.1使用一个Preference占位,然后重新实现onPreferenceTreeClick()函数: 

Java代码  收藏代码

  1. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {  

  2.         String key = preference.getKey();  

  3.         if( key != null ){  

  4.             if(key.equals("some_key")) {  

  5.                 showDialog(DIALOG_SOME_KEY);  

  6.             }  

  7.         }  

  8.         return super.onPreferenceTreeClick(preferenceScreen, preference);  

  9.     }  


当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。 

Java代码  收藏代码

  1. SharedPreferences.Editor editor = preference.getEditor();  

  2.     editor.putLong("ttt"123);  

  3.     editor.commit();  


此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。 
3.2自定义选项类: 
此处以一个选择时间的对话框选项为例。 
3.2.1 从DialogPreference继承一个类: 

Java代码  收藏代码

  1. public class TimePreference extends DialogPreference  


3.2.2 构造函数: 

Java代码  收藏代码

  1. public TimePreference(Context context, AttributeSet attrs) {  

  2.         super(context, attrs);        

  3.         setDialogLayoutResource(R.layout.time_preference);  //加载布局文件  

  4.     }  


3.3.3 布局文件: 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="utf-8"?>  

  2.     <RelativeLayout  

  3.       xmlns:android="http://schemas.android.com/apk/res/android"  

  4.       android:layout_width="fill_parent"  

  5.       android:layout_height="fill_parent">  

  6.     <TimePicker android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/timePicker_preference" android:layout_centerHorizontal="true"></TimePicker>  

  7.     </RelativeLayout>  


定义了一个id为timePicker_preference的TimePicker。 
3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。 

Java代码  收藏代码

  1. @Override  

  2.     protected void onBindDialogView(View view) {  

  3.         super.onBindDialogView(view);  

  4.                   

  5.         mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference);  

  6.         if(mPicker != null) {             

  7.             mPicker.setIs24HourView(true);  

  8.             long value = mValue;  

  9.             Date d = new Date(value);  

  10.             mPicker.setCurrentHour(d.getHours());  

  11.             mPicker.setCurrentMinute(d.getMinutes());  

  12.         }  

  13.           

  14.     }  


3.3.5 保存值:在对话框关闭时保存值。 

Java代码  收藏代码

  1. @Override  

  2.     protected void onDialogClosed(boolean positiveResult) {  

  3.         super.onDialogClosed(positiveResult);  

  4.         if(positiveResult) {                  

  5.             Date d = new Date(000, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0);              

  6.             long value = d.getTime();  

  7.             if(callChangeListener(value)) {  

  8.                 setValue(value);  

  9.             }  

  10.         }  

  11.     }  



3.3.6 使用此preference: 
在参数定义文件中增加: 

Xml代码  收藏代码

  1. <cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>  


类似于使用自定义控件。 

运行即可看到效果: 
 
3.3.7 使用默认值: 
在参数定义文件中增加一个定义: 

Xml代码  收藏代码

  1. <cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>  


并且自定的preference类中要实现两个函数: 

Java代码  收藏代码

  1. @Override  

  2. protected Object onGetDefaultValue(TypedArray a, int index) {  

  3.     return a.getString(index);  

  4. }  


以及 
       

Java代码  收藏代码

  1. @Override  

  2.     protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {  

  3.         long value;  

  4.         if(restorePersistedValue) value = getPersistedLong(0);  

  5.         else {  

  6.             value = Long.parseLong(defaultValue.toString());  

  7.         }  

  8.         setValue(value);  

  9.     }  


当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使用默认值。 

原文路径:http://mypyg.iteye.com/blog/839501

本文转载自:http://mypyg.iteye.com/blog/839501

wanyang
粉丝 3
博文 41
码字总数 7838
作品 0
徐汇
程序员
私信 提问
android基础知识07:SharedPreferences和PreferenceActivity

本文主要介绍SharedPreferences和PreferenceActivity的基础知识和用法。 主要资料来源于网络,包括但不限于: 《Android之PreferenceActivity》 《在Android中Preferences数据存储的使用》 ...

迷途d书童
2012/03/23
8.7K
1
Android之PreferenceActivity

看到很多书中都没有对PreferenceActivity做介绍,而我在看Android Samples时无意中看见了,所以就稍微总结一下,也方便日后查找。 PerferenceActivity是什么,看下面的截图: 好了,我们看到...

晨曦之光
2012/03/05
367
0
Android开发之--Preferences的使用

在android程序中,记录用户的偏好是个能极大提升用户体验的功能。Android里面的Preferences正式为此事而生。 Preferences可以用来记录简单的整数,布尔值,字符串等数据,且在各个Activity之...

gesuper
2013/10/06
190
1
PreferenceActivity相关细节

一、写作前面 当我们做应用的时候,需要用户配置一些信息,而这就是通常所说的应用设置。 对于Android系统来说,系统本身的设置带来的用户体验和习惯已经深入人心,在我们的应用中同样用到类...

json_wjw
2016/09/23
19
0
Android中preference的使用(二)

继上篇文章 Android中preference的使用(一) ,在这篇文章中主要是学习下preference中各个节点的属性。PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到...

鉴客
2011/11/14
24.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

谁说多功能和低价格不能兼得?Aspose系列产品1024购买指南请查收!

你还在为了Word、Excel、PDF、CAD等文档格式转换而发愁吗? 你是否在寻找一款能够在应用程序中文档管理的工具呢? Aspose——支持100多种文件格式创建、编辑、转换和打印! 往下看,找一找哪...

mnrssj
10分钟前
1
0
hbase客户端API

本章介绍用于对HBase表上执行CRUD操作的HBase Java客户端API。 HBase是用Java编写的,并具有Java原生API。因此,它提供了编程访问数据操纵语言(DML)。 HBaseConfiguration类 添加 HBase 的配...

水木星辰
10分钟前
2
0
[插件化开发] 1. 初识OSGI

初识 OSGI 背景 当前product是以solution的方式进行售卖,但是随着公司业务规模的快速夸张,随之而来的是新客户的产品开发,老客户的产品维护,升级以及修改bug,团队的效能明显下降,为了解...

IsaacZhang
10分钟前
1
0
Webstorm 环境使用 nuxt.js 做开发,@ 和 ~ 别名配置

好的IDE + 好的代码提示 = 高效率的开发 webstorm 设置@和~别名,有助于代码查看和跳转. step 0 在项目下创建一个webpack.config.js,内容如下: const path = require('path')module.exp...

皇虫
14分钟前
2
0
Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇

上一期我们介绍了如何基于 Knative Serverless 技术实现天气服务-上篇,首先我们先来回顾一下上篇介绍的内容: 通过高德天气 API 接口,每隔 3 个小时定时发送定时事件,将国内城市未来 3 天...

Mr_zebra
32分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部