• 某android平板项目开发笔记自定义sharepreference UI


    前言

      android对于小数据的存储,提供了一个很好的框架就是Sharepreference,但是,我们在做项目的时候会发现,官方自带的sharepreference 的UI 是远远满足不了我们的需要(例如,设置备份时间等),这个时候,就需要我们定制一个sharepreference UI,上网找了一下,发现,这方面的资料不多,不知道,是不是我用的关键字不对,导致,一直google 不出来…于是,我DEBUG 一下源码, 把大致的方法给debug 出来…

    1.从源代码里面找线索之一

    (1)官方的Sharepreference UI

    share

    从上图可以看出,官方用于做sharepreference 的UI 就只有5个而已,远远不能满足我们的需要,于是,我们就要想办法定制一个.(注意:MultiSelectListPreference(api 11 以后才支持..))

    (2) 定制一个Sharepreference UI

    1,效果图

    麦库截图20120302191811

    2,怎么做?

    首先,我们看一下实现的类图:(从左往右)

    share2

    (1)上面的例子是一个对话框交互的首选项设置,于是,我就继承了DialogPreference,当然,如果只是开关设置的话,就请继承TwoStatePreference,如果,这两个,都满足不了你的需要,你可以选择直接继承Preference.

    (2) 接下来,我们就是定制我们的Preference UI

    关于定制

    1,你可以直接使用代码

    2,你可以写布局文件

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

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

    	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 流程图

    share3

    从上图可知,我们启动PreferenceActivity的时候,会初始化所有Preference UI,这就是为什么我们要把布局文件写在构造方法当中的原因.

    (2) 调用过程

    1,点击我们的UI,将会调用如图所示的方法

    share4

    2,点击确定或者取消以后,就会调用onDialogClosed,如下图所示

    share4

    与我们使用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);
    		}
    	}

    截个小图来表示一下:

    麦库截图20120302204715

    顺便给个建议,如果上网找不到资料的话,直接debug 源码,从源码中找出规律不失为一个好办法..

  • 相关阅读:
    jQuerychicun
    css3动画
    app开发,H5+CSS3页面布局小tips
    函数基础
    函数
    冒泡排序
    关于Vue+iview的前端简单的导入数据(excel)
    关于Vue+iview的简单下拉框滚动加载
    ES6中set的用法回顾
    百度地图api设置点的自定义图标不显示
  • 原文地址:https://www.cnblogs.com/youxilua/p/2377754.html
Copyright © 2020-2023  润新知