Android 自定义ListPreference

自定义sharepreference
UI

http://www.cnblogs.com/youxilua/archive/2012/03/02/2377754.html

原来自定义很简单!

public class CameraTypeListPreference extends ListPreference {

	public CameraTypeListPreference(Context context) {
		super(context);
	}

	public CameraTypeListPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public void setValue(String value) {
		// TODO Auto-generated method stub
		super.setValue(value);
		Log.d("lzx", "setValue  " + value);
	}

	@Override
	protected void onDialogClosed(boolean positiveResult) {
		// TODO Auto-generated method stub
		super.onDialogClosed(positiveResult);
		Log.d("lzx", "onDialogClosed  getValue " + getValue());
		Log.d("lzx", "onDialogClosed  getKey " + getKey());
		Log.d("lzx", "positiveResult  " + positiveResult);
		if(getEntry() != null){
			Log.d("lzx", "onDialogClosed  getEntry " + getEntry());
		}
		if(positiveResult){
			String value = getValue();
			Log.d("lzx", "save data  "+ value);
			if(!TextUtils.isEmpty(value)){
				getEditor().putInt(getKey(), Integer.valueOf(value)).commit();
				getEditor().putInt("lzx", 999).commit();
			}

		}
	}
}

前言

  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,你可以写布局文件

 

这里,我选择写一个布局文件,就是效果图的那样了…

然后在构造方法中这样写:


1

2

3

4

5

6

public TimeSettingPreference(Context
context, AttributeSet attrs) {

    super(context,
attrs);

    setDialogLayoutResource(R.layout.preference_timesetting);

 

 

}

 

接着,在sharepreference配置的xml 加上

 <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 写好要保存的方式

@Override
	protected void onDialogClosed(boolean positiveResult) {
		// TODO Auto-generated method stub
		super.onDialogClosed(positiveResult);
		if (positiveResult) {
			setTime();
		}
	}

2,写我们的setTime()方法即可..

private 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 源码,从源码中找出规律不失为一个好办法..

时间: 2024-09-17 23:56:49

Android 自定义ListPreference的相关文章

android自定义view插入xml

问题描述 android自定义view插入xml 自定义View代码如下.我希望把这个view插入到一个layout的xml的文件中.一直出错,错误类型是error inflating class.应该是这个View出的问题package com.example.browserstation; import java.util.Timer;import java.util.TimerTask; import android.content.Context;import android.graph

组合-android自定义view怎样指定自定义view的布局

问题描述 android自定义view怎样指定自定义view的布局 我有现成的布局xml文件,现在想定义一个组合的自定义view,怎样把这个view的布局指定为一个xml文件 解决方案 LayoutInflater.from(mActivity).inflate(R.layout.mainscreen_title, this, true);这样就行了,this是当前的View,而后面这两个参数是将R.layout.mainscreen_title attachToRoot 也就是以当前这个Vie

Android自定义View之使用贝塞尔曲线实现流量进度条

第一次写带图片的博客,多少还是有点紧张,效果不好,请将就着看,前面的图是今天要写的控件的效果图,元素不多,分别是一个按钮和一个自定义的控件. 在此以前,我看过许多的书,比如<Android群英传>.<第一行代码>等,也看了很多大神的博客,但是即便是这样,当我看到这么多代码的时候,一直都没有真正的动手去敲过这些代码,以至于我总是觉得自定义View是一个多么高深莫测的技术,我们这些小白是难以触及的,但是当昨晚看了一篇鸡汤之后,觉得人还是要学会专注,要耐得住寂寞,要沉得住气.所以在未来的

Android自定义View之绘制音乐播放器示波器

周末玩的有点嗨,没更新博客了,今天补上,这个示波器是在大学的时候老师教的,但是出来工作一直没有用到过,渐渐的也就忘记了,现在重新学习一下.来看看效果图: 这里是一个自定义的柱状图,然后有一个按钮,点击按钮的时候,这里柱子会不停的运动,类似于音乐播放器里示波器的跳动. 跟前面几个自定义view的方式类似,重写了onSizeChange()方法和onDraw()方法  先列一下我们要用到的变量 Paint mPaint; mWidth; mRectWidth; mRectHeight; mRectC

Android自定义View之弧线展示图

前面我也写了有几个自定义进度的控件,那么,今天,我再加一个控件,原理跟前面讲的差不多,先看看效果: 这个是一个以弧线为依托的进度控件,主要包括了两个圆弧.一个圆.一个文本. 当我们点击开始按钮的时候,会出现一个动画,逐渐的出现进度,好了,下面开始我们的编码. 新建一个类,继承自View,实现三个构造方法,接着定义变量,初始化变量的数据.代码如下: Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; length; mRadius; mCircle

Android自定义View之仿QQ等级天数进度

最近一直都在看自定义View这一块.差不多一个星期了吧.这个星期坚持每天更新博客,感觉自己的技术也有点突破,对自定义View的计算也有了更深的认识. 今天坐地铁玩手机的时候,看到手机一个成长天数进度的控件,觉得挺有意思的,于是想自己也写一个.效果如下: 由图可以知道,这里面有很多个元素,首先是背景的矩形区域,其次就是两个环形,然后三个Text文本.其实不复杂,我们一点一点的去实现. 首先呢,画矩形背景.这里用到一个RectF的类,这个类包含一个矩形的四个单精度浮点坐标.矩形通过上下左右4个边的坐

Android自定义View之仿vivo i管家病毒扫描动画效果

技术是永无止境的,如果真的爱技术,那就勇敢的坚持下去.我很喜欢这句话,当我在遇到问题的时候.当我觉得代码枯燥的时候,我就会问自己,到底是不是真的热爱技术,这个时候,我心里总是起着波澜,我的答案是肯定的,我深深的爱着这门技术. 今天我们继续聊聊Android的自定义View系列.先看看效果吧: 这个是我手机杀毒软件的一个动画效果,类似于雷达搜索,所以用途还是很广泛的,特别是先了解一下这里的具体逻辑和写法,对技术的进步一定很有用. 先简单的分析一下这里的元素,主要有四个圆.一个扇形.还有八条虚线.当

Android自定义View之实现理财类APP七日年化收益折线图效果

这段时间的自定义View学习,学会了绘制柱状图.绘制折线图.绘制进度控件,那我们今天就来聊聊另外一种自定义的View,这就是我们常见的七日年化收益折线图效果.先看看长什么样. 这就是效果图了,元素相对而言还是比较多的,这里有线.柱状图.文字.折线.点等等.看起来好像很复杂,但是呢,只要一步一步的实现,那还是可以达到这种效果的,之前我们说过的, 自定义View,就像是在photo shop里面画图,想要什么就画什么,我们可以有很多的画笔工具,也可以有很多的图层. 先看看我们这一次用到哪些变量. P

Android自定义GridView显示一行并且可以左右滑动

最近做一个类似滑动菜单栏的title,绑定数据源用的是GrildView,想要实现 横着滑动并且GrildView只显示一行.最终采用代码形式在Activity中动态的添加 布局实现. ViewGroup.LayoutParams params = dishtype.getLayoutParams(); // dishtype,welist为ArrayList int dishtypes = welist.size(); params.width = 115 * dishtypes; Log.d