- 浏览: 551222 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
q649916440:
使用这个的目的是什么呢?感觉没啥优势啊,用起来还绕个大圈
使用googleapi-client-java操作gtasks(一) -
文艺吧网:
还有一个GZIP的问题,我怎么转都乱码最后是因为要解压一下ht ...
关于使用InputStreamReader读取GBK编码文件乱码的问题 -
xiaodousa:
9楼正解!
Android在Listview中使用EditText -
fxiaozj:
<div class="quote_title ...
Android PreferenceActivity 学习笔记 -
zylc369:
楼主很用心,一定要顶
Android通过共享用户ID来实现多Activity进程共享
在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。
为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。
PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。
1.MainActivity:
按下Menu按键弹出菜单,点击菜单启动SettingActivity。
2.SettingActivity继承自PreferenceActivity:
在onCreate函数中加载参数定义文件。
当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。
获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。
3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。
添加一个CheckBoxPreference子项,并设置属性:
Key:checkbox_key
Title:CheckBox Item
Summary:test check box item
key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容:
启动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:
此参数设置项会弹出一个文本输入对话框,并在配置文件中生成类似以下内容:
<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()函数:
当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。
此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。
3.2自定义选项类:
此处以一个选择时间的对话框选项为例。
3.2.1 从DialogPreference继承一个类:
3.2.2 构造函数:
3.3.3 布局文件:
定义了一个id为timePicker_preference的TimePicker。
3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。
3.3.5 保存值:在对话框关闭时保存值。
3.3.6 使用此preference:
在参数定义文件中增加:
类似于使用自定义控件。
运行即可看到效果:
3.3.7 使用默认值:
在参数定义文件中增加一个定义:
并且自定的preference类中要实现两个函数:
以及
当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使用默认值。
怎么获取?
为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。
PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。
1.MainActivity:
按下Menu按键弹出菜单,点击菜单启动SettingActivity。
2.SettingActivity继承自PreferenceActivity:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); }
在onCreate函数中加载参数定义文件。
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。
Preference android.preference.PreferenceActivity.findPreference(CharSequence key);
获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。
3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> </PreferenceScreen>
添加一个CheckBoxPreference子项,并设置属性:
Key:checkbox_key
Title:CheckBox Item
Summary:test check box item
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="checkbox_key" android:title="CheckBox Item" android:summary="test check box item"></CheckBoxPreference> </PreferenceScreen>
key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="checkbox_key" value="true" /> </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:
<EditTextPreference android:dialogTitle="Edit Text Dialog" android:key="edittext_key" android:dialogMessage="Please Input text" 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()函数:
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { String key = preference.getKey(); if( key != null ){ if(key.equals("some_key")) { showDialog(DIALOG_SOME_KEY); } } return super.onPreferenceTreeClick(preferenceScreen, preference); }
当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。
SharedPreferences.Editor editor = preference.getEditor(); editor.putLong("ttt", 123); editor.commit();
此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。
3.2自定义选项类:
此处以一个选择时间的对话框选项为例。
3.2.1 从DialogPreference继承一个类:
public class TimePreference extends DialogPreference
3.2.2 构造函数:
public TimePreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.time_preference); //加载布局文件 }
3.3.3 布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TimePicker android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/timePicker_preference" android:layout_centerHorizontal="true"></TimePicker> </RelativeLayout>
定义了一个id为timePicker_preference的TimePicker。
3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。
@Override protected void onBindDialogView(View view) { super.onBindDialogView(view); mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference); if(mPicker != null) { mPicker.setIs24HourView(true); long value = mValue; Date d = new Date(value); mPicker.setCurrentHour(d.getHours()); mPicker.setCurrentMinute(d.getMinutes()); } }
3.3.5 保存值:在对话框关闭时保存值。
@Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if(positiveResult) { Date d = new Date(0, 0, 0, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0); long value = d.getTime(); if(callChangeListener(value)) { setValue(value); } } }
3.3.6 使用此preference:
在参数定义文件中增加:
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>
类似于使用自定义控件。
运行即可看到效果:

3.3.7 使用默认值:
在参数定义文件中增加一个定义:
<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>
并且自定的preference类中要实现两个函数:
@Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getString(index); }
以及
@Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { long value; if(restorePersistedValue) value = getPersistedLong(0); else { value = Long.parseLong(defaultValue.toString()); } setValue(value); }
当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使用默认值。
评论
4 楼
fxiaozj
2014-06-09
zyp09 写道
很想知道在Mainactivity界面怎么获得TimePreference的TimePicker时间值??
怎么获取?
3 楼
zyp09
2012-12-27
很想知道在Mainactivity界面怎么获得TimePreference的TimePicker时间值??
2 楼
yinlei714
2011-12-07
哈哈,太感谢了,我刚接触prefernece,网上找了很多资料都不怎么样,看了你这个,我终于弄出来了,不错,顶!!!!




1 楼
shiftjava
2011-01-26
相比其他PreferenceActivity,您的介绍较全,挺好,支持!

发表评论
-
使用googleapi-client-java操作gtasks(二)
2012-03-29 15:34 4666对于很多第三方的机器没有安装Google账户管理,要访问GTa ... -
Android Activity 生命周期再验证
2011-11-22 16:20 8042Android Activity 生命活动 ... -
Nexus one开关键坏掉后的解决方法
2011-10-14 15:17 4514Nexus one手机无法开机了,网上搜索了一下发现很多人遇到 ... -
改包名导致JNI调用失败的问题
2011-08-31 13:41 5227修改以前的代码,移动了一个文件,修改了其包名,在这个文件代码中 ... -
使用googleapi-client-java操作gtasks(一)
2011-08-10 18:07 14999Google Tasks的API终于开放 ... -
一个好用的Google api调试网址
2011-08-09 11:00 1885https://code.google.com/apis/ex ... -
Apk文件Hack试验
2011-07-11 17:54 2905试验1:反编译dex文 ... -
一个由onKeyUp引起的问题
2011-04-19 16:05 1994刚写一个小程序,在用户按下Back按键返回时,需要保存一些数据 ... -
Android自定义组合控件
2011-03-20 18:56 12942目标:实现textview和ImageButton组合,可以通 ... -
也谈Android下一个apk安装多个程序入口图标
2011-03-18 11:28 9255Android中有的Ap功能比较复杂,为了方便用户使用,可以提 ... -
Android AppWidget实例验证
2011-02-25 15:26 134601.创建AppWidget布局,包含两个TextView用来显 ... -
Android Activity LaunchMode 验证
2011-02-23 15:04 8402在Android中,每个Activity有4种LaunchMo ... -
文件夹权限引起的MediaPlayer播放不正常
2011-01-20 20:41 2407写了一个Ap,在程序运行时会解压一些声音文件到/data/da ... -
关于使用InputStreamReader读取GBK编码文件乱码的问题
2011-01-19 17:13 25840BufferedReader reader = new Buf ... -
Android下Listview的onItemClick以及onItemLongClick等易模糊问题验证
2010-12-23 21:10 22829最近在使用Listview又遇到了以前碰到的问题,当Listv ... -
通过Java annotation以及反射机制实现不同类型通用的数据库访问接口
2010-12-22 12:14 5600在日常开发中会遇到这 ... -
Android平台sqlite快速入门
2010-12-07 12:00 2438以下概念都是在Android平台的sqlite3限制下的理解: ... -
Android下使用googleapi-client-java操作google calendar(三)
2010-11-29 18:57 48164.获取日历列表并显示: 原理:向https://www. ... -
Android下使用googleapi-client-java操作google calendar(二)
2010-11-28 22:50 23953.与服务器进行数据交互: 交互是通过HTTP请求及响应来进 ... -
Android下使用googleapi-client-java操作google calendar(一)
2010-11-19 14:41 5028刷机又把数据刷没了,网络时代,数据还是和服务器同步好了。 从 ...
相关推荐
在Java代码中,我们需要创建一个继承自`PreferenceActivity`的类,如`Chapter21Test1`,并在`onCreate()`方法中调用`addPreferencesFromResource(R.xml.c21preference)`,这会将XML文件中的Preference布局加载到...
在Android开发中,个人学习笔记往往涵盖了许多实用技巧和细节。以下是一些关键知识点的详细说明: 1. 上下文菜单(Context Menu):在ListView中,长按时可以通过实现onCreateContextMenu()方法创建上下文菜单。当...
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。