某android平板项目开发笔记--自定义sharepreference UI
2012-03-02 20:52 youxiachai 阅读(5524) 评论(0) 编辑 收藏 举报前言
android对于小数据的存储,提供了一个很好的框架就是Sharepreference,但是,我们在做项目的时候会发现,官方自带的sharepreference 的UI 是远远满足不了我们的需要(例如,设置备份时间等),这个时候,就需要我们定制一个sharepreference UI,上网找了一下,发现,这方面的资料不多,不知道,是不是我用的关键字不对,导致,一直google 不出来…于是,我DEBUG 一下源码, 把大致的方法给debug 出来…
1.从源代码里面找线索之一
(1)官方的Sharepreference UI
从上图可以看出,官方用于做sharepreference 的UI 就只有5个而已,远远不能满足我们的需要,于是,我们就要想办法定制一个.(注意:MultiSelectListPreference(api 11 以后才支持..))
(2) 定制一个Sharepreference UI
1,效果图
2,怎么做?
首先,我们看一下实现的类图:(从左往右)
(1)上面的例子是一个对话框交互的首选项设置,于是,我就继承了DialogPreference,当然,如果只是开关设置的话,就请继承TwoStatePreference,如果,这两个,都满足不了你的需要,你可以选择直接继承Preference.
(2) 接下来,我们就是定制我们的Preference UI
关于定制
1,你可以直接使用代码
2,你可以写布局文件
这里,我选择写一个布局文件,就是效果图的那样了…
然后在构造方法中这样写:
123456public
TimeSettingPreference(Context context, AttributeSet attrs) {
super
(context, attrs);
setDialogLayoutResource(R.layout.preference_timesetting);
}
接着,在sharepreference配置的xml 加上
1234<
com.achai.shop.preferences.TimeSettingPreference
android:key="@string/shop_infor_name"
android:title="@string/shop_infor_name"
/>
这样就完成了,对于sharepreference 自定义UI的配置.
2.从源代码里面找线索 之二
只是,完成了一个UI是远远不够的,我们还需要把我们设置的值,存进SharePreference这个框架里面!
以下内容,可能比较啰嗦…
FAQ:
1, 我们怎么控制DialogPreference和我们一直用的AlertDialog控件的方法一样吗?
2, 怎么把值存进Sharepreference 里面?
(1),第一次启动PreferenceActivity 流程图
从上图可知,我们启动PreferenceActivity的时候,会初始化所有Preference UI,这就是为什么我们要把布局文件写在构造方法当中的原因.
(2) 调用过程
1,点击我们的UI,将会调用如图所示的方法
2,点击确定或者取消以后,就会调用onDialogClosed,如下图所示
与我们使用alertDialog 不同的是,DialogPreference 关闭的时候,统一调用onDialogClosed(boolean positiveResult)方法,确认还是取消,只要进行判断即可.
x
至此,我们搞清楚了,这个Dialogpreference 整个运行流程,接下来得问题是,怎么绑定我们的控件呢?
onCreateDialog() || onBindDialogView(View view) ?
如果,你的控件是写在xml 里面当中的,你就只能用onBindDialogView,一般而言我们不重写onCreateDialog()…
总结:
如果,你用的是DialogPreference,仅仅能用你至少需要重写:
- onBindDialogView(View view)
- onDialogClosed(boolean posittiveResult)
为了你的程序写得更好,你除了重写以上方法以外还需要重写
- onSetInitialValue(boolean restoreValue, Object defaultValue)
- onSaveInstanceState()
- onRestoreInstanceState(Parcelable)
接下来,我们就要把我们的值,存进Sharepreference里面
3.从源代码里面找线索 之三
这部分内容,就要把我们的值存到sharepreference里面,其实很简单..
1,在onDialogClosed 写好要保存的方式
12345678@Override
protected void onDialogClosed(boolean positiveResult) {
// TODO Auto-generated method stub
super.onDialogClosed(positiveResult);
if (positiveResult) {
setTime();
}
}
2,写我们的setTime()方法即可..
12345678910111213141516private void setTime() {
// shopStart.gett
@SuppressWarnings("unused")
//检查是否需要关闭依赖...
final boolean wasBlocking = shouldDisableDependents();
int currentHour = shopStart.getCurrentHour();
int currentMinute = shopStart.getCurrentMinute();
//持久化值
persistString(currentHour+":"+currentMinute);
//再次检查是否需要关闭依赖...
final boolean isBlocking = shouldDisableDependents();
//更新所有依赖改变
if(isBlocking != wasBlocking) {
notifyDependencyChange(isBlocking);
}
}
截个小图来表示一下:
顺便给个建议,如果上网找不到资料的话,直接debug 源码,从源码中找出规律不失为一个好办法..
作者:游戏阿柴
出处:http://www.cnblogs.com/youxilua
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微博联系:新浪微博
用支付宝赞助博主:http://me.alipay.com/youxilua
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!