`
zhiweiofli
  • 浏览: 514732 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于简单工厂思想的SharePreference组件设计

 
阅读更多

在app的开发中,让用户设置自己的偏好,能给用户很友好的体验。在android系统中,google很贴心的提供了SharePreference组件,方便开发者存储app的数据。SharePreference提供的API,对简单的基本类型数据,以键值对(key-value)的方式进行的存储,使用极其简单。具体使用教程可以留意google的官方文档,这篇blog主要是介绍使用简单工厂模式开发基于SharePreference的用户偏好设置界面。


先介绍基本的组件,SharePreference数据的可视化的组件PreferenceActivity,以及交互响应接口OnPreferenceChangeListener, OnPreferenceClickListener。


我们可以利用PreferenceActivity的可视化设计器,设计基本的UI控件,并设置其对应的信息,具体如何去设置请看官自己找资料了。

 


  

下面是我的一个例子:

 

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/system_settings" >

    <PreferenceCategory android:title="@string/email_category" >
 
        <EditTextPreference
            android:dialogTitle="@string/change_email_dialog_title"
            android:key="@string/change_email_account_key"
            android:negativeButtonText="@string/cancel"
            android:positiveButtonText="@string/config"
            android:summary="@string/change_email_account_summary"
            android:title="@string/change_email_account_title" android:selectable="true"/>
    </PreferenceCategory>

    <PreferenceCategory android:title="@string/ring_category" >

        <CheckBoxPreference
            android:dependency="@string/receive_sms_command_key"
            android:enabled="true"
            android:key="@string/ring_key"
            android:summaryOff="@string/ring_summary_off"
            android:summaryOn="@string/ring_summary_on"
            android:title="@string/ring_title" android:selectable="true" android:defaultValue="true"/>
    </PreferenceCategory>

</PreferenceScreen>
  

之后可以在PreferenceActivity通过方法addPreferencesFromResource加载该xml文件即可显示你设计好的偏好设置界面。


之后就是监听用户的交互动作,一般就是Preference的OnClick事件还有OnChange事件,并在对应的监听器中加以处理响应,完成设置流程。


这里值得注意的是,即使你不去监听并响应一般事件,Preference也会自动保存用户更改操作后的状态,你的app可以通过具体的Preference引用获取到其当前的value。当然你也可以通过在OnChange事件响应中,把具体的状态值键值对形式保存到SharePreference中,以便app能更方便地访问到用户设置的value。


可是这样子的话,问题就来了。我们得在监听器中为每一个Preference发生的事件进行监听并响应!假如Preference只有几个还比较容易维护,但是app的迭代周期是很短的,几次迭代后,需求可能会变化巨大,十几个Preference的事件响应代码就难以修改和维护了。而且这也违反了对修改封闭,对扩展开放的原则。


然而每个Preference的行为又是那么的简单,只有onClick和onChange!为了简便各Preference的行为响应,我们可以利用简单工厂模式以及Java强大的反射机制来进行设计!


简单工厂的原理如下:

 

 

我们的思路如下:

 

1、设计一个行为接口IPrefListener ,定义行为doWhenOnClick和doWhenChange:

 

 

public interface IPrefListener {
	
	public boolean doWhenChange(Context ctx, Object o);

	public boolean doWhenOnClick(Preference pref);
}
 

2、通过实现IPrefListener,使具体的Preference具有各自的响应行为

 

 

public class EmailPrefChangeListener implements IPrefListener {

	@Override
	public boolean doWhenChange(Context ctx, Object o) {
		String address = (String) o;
		boolean isOk = BaseUtils.isRightEmailAddress(address);
		if(isOk){
			updateCache(ctx,address);
			showTipsForUser(ctx);
		} else {
			DialogFactory df = new DialogFactory(ctx);
			Dialog dialog = df.onCreateDialog(DialogFactory.DIALOG_ID_EMAIL_ERROR);
			dialog.show();
		}
		return isOk;
	}
	
	private void updateCache(Context ctx, String account){
		SharePrefHelper.getInstance(ctx).writeData(PrefConst.KEY_EMAIL_ACCOUNT, account);
	}
	
	private void showTipsForUser(Context ctx){
		String tips = ctx.getResources().getString(R.string.toast_email_account_change_succ);
		Toast.makeText(ctx, tips, Toast.LENGTH_SHORT).show();
	}

	@Override
	public boolean doWhenOnClick(Preference pref) {
		String defaultValue = SharePrefHelper.getInstance(pref.getContext()).readData(PrefConst.KEY_EMAIL_ACCOUNT, "");
		EditTextPreference etPref = (EditTextPreference) pref;
		etPref.getEditText().setText(defaultValue);
		return true;
	}

}
 

 

 

3、然后利用PreferenceActivity作为工厂,并实现OnPreferenceChangeListener, OnPreferenceClickListener接口响应各Preference的事件。

 

  初始化布局中的Preference的监听器,并在事件响应方法中,利用Preference的key反射获得具体的IPrefListener 实现类的实例,再去调用对应的方法

 

 

        @Override
	public boolean onPreferenceChange(Preference preference, Object newValue) {
		Log.i(TAG, preference.getKey()+"had change, new value:"+newValue);
		boolean isChangeSucc = true;
		String key = preference.getKey();
		try {
			//利用java的反射机制,new出一个负责当前设置变更响应的处理类实例
			IPrefListener listener = (IPrefListener) this.getApplicationContext()
					.getClassLoader().loadClass(key).newInstance();
			isChangeSucc = listener.doWhenChange(SettingActivity.this, newValue);
		}  catch (Exception e) {
			e.printStackTrace();
		} 
		
		return isChangeSucc;
	}

	@Override
	public boolean onPreferenceClick(Preference preference) {
		Log.i(TAG, preference.getKey()+"had click");
		boolean isChangeSucc = true;
		String key = preference.getKey();
		try {
			//利用java的反射机制,new出一个负责当前设置变更响应的处理类实例
			IPrefListener listener = (IPrefListener) this.getApplicationContext()
					.getClassLoader().loadClass(key).newInstance();
			isChangeSucc = listener.doWhenOnClick(preference);
		}  catch (Exception e) {
			e.printStackTrace();
		} 
		
		return isChangeSucc;
	}
 

 

上面我们有一个技巧,就是把具体的IPrefListener 实现类的完整类名作为Preference的key,通过这样,实现接口的类就和对应的Preference联系起来了!


以后再有偏好设置要增加进来,只需要在布局文件布局好,然后实现IPrefListener的对应类, 把其完整的类名配置到String.xml中,并于布局文件中引用即可,这样子实现响应的代码就与控制的代码分离了,结构更清晰,维护更简单,当然也符合对修改封闭,对扩展开放的原则!

 

 

  • 大小: 29.8 KB
  • 大小: 8.9 KB
分享到:
评论

相关推荐

    sharePreference

    封装的一些关于sharePreference的方法

    SharePreference

    下面我们将详细介绍如何在Android应用中进行SharePreference的简单使用。 ### 1. 获取SharePreference实例 在Android应用中,我们首先需要获取到SharePreference的实例。这通常在Activity或Fragment中进行。有两种...

    SharePreference与File详解

    `SharePreference`是Android提供的一种轻量级的数据存储机制,主要用于存储简单的键值对数据,如布尔值、整型、浮点型、字符串等。这些数据通常以XML格式保存在设备的沙盒文件系统中,易于读写且持久化。 #### (1) ...

    sharepreference

    Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/&lt;package name&gt;/...

    sharepreference删除文件数据不会丢失.rar

    它提供了一种简单的方式来保存和检索应用程序的配置设置或任何其他简单的键值对数据。这个名为"sharepreference删除文件数据不会丢失.rar"的压缩包文件可能包含了关于如何在SharedPreferences中处理数据删除和恢复的...

    Sharepreference

    在Android开发中,`SharedPreferences` 是一个非常重要的轻量级数据存储机制,它主要用于存储一些简单的配置信息,如用户设置、应用状态等。这个“Sharepreference”主题涉及到的是对`SharedPreferences`进行代码...

    Android 序列化对象存储到sharepreference

    在Android开发中,序列化(Serialization)是一种将对象转换为可传输或存储格式的过程,而SharedPreferences则是一个轻量级的数据存储机制,常用于保存应用程序的简单配置数据。本篇文章将详细探讨如何将Android序列...

    android跨应用sharepreference数据共享

    SharedPreferences是Android提供的一种轻量级的数据存储机制,它允许我们保存和读取简单的键值对数据,如字符串、整型、布尔值等。 首先,了解SharedPreferences的工作原理。SharedPreferences是基于XML文件存储的...

    android4.0跨应用共享数据通过sharepreference

    SharedPreferences是基于XML文件存储的,这些文件存储在应用的私有数据目录下,通常只有该应用有权限访问。然而,如果我们想要在不同的应用程序之间共享数据,我们需要进行一些额外的设置。 1. **创建共享的...

    SharePreference音本应用

    在这个"SharePreference音本应用"中,我们将探讨如何利用`SharedPreferences`来存储和读取数据,以及在实际应用场景中的使用技巧。 `SharedPreferences`是一个接口,它提供了键值对存储的方式,支持基本数据类型如...

    基于Android的解谜游戏设计与实现.docx

    综上所述,基于Android的解谜游戏设计与实现涉及多方面知识和技术,不仅要求开发者具备扎实的技术功底,还需要具备良好的创意和用户体验意识。通过不断的测试与优化,可以开发出既有趣又有教育意义的移动游戏。

    百度定位并获取县区天气-XML+fragment+SharePreference.zip

    此工程较BaiduLocationXML相比: 1.植入fragment,结合微信UI 2.在原本主界面的button textview textview 移植到Fragment1 3.增加网络判断,网络不通的情况下做另外处理 4.在网络通畅的情况下,将地址信息、天气信息...

    Android毕业设计论文

    【Android 毕业设计】基于 Android 的解谜游戏开发是一项综合性的软件工程实践,旨在让学生在毕业设计中深入理解Android应用开发技术,并将其应用于实际的游戏制作中。本设计主要涵盖了以下几个关键知识点: 1. **...

    sharepreference工具类

    很好用的工具类,使用sharepreference存储数据,节省程序员开发时间

    SharePreference存储demo

    不同于文件的存储方式,SharePreference是使用键值对的方式来存储数据的。也就是说 当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以 通过键把相应的值取出来。

    SharePreference类似于JavaEE中的session

    在Android开发中,SharePreferences是用于存储轻量级数据的关键组件,它被广泛用来持久化应用的设置或用户偏好。SharePreferences与JavaEE中的session有某些相似之处,但它们的本质和用途有所不同。在这个讨论中,...

    Eclipse编写的Android SharePreference应用实例

    本教程将基于Eclipse IDE V4.2.0,通过一个实例详细讲解如何使用SharePreferences来实现数据的持久化存储。 **一、SharePreferences简介** SharePreferences通常用来存储一些简单的键值对数据,如字符串、整型、...

    android_save_data.rar_android_android 网络_sharepreference

    - `AndroidManifest.xml`:应用的清单文件,包含了应用的元数据,如权限、组件声明等。 - `bin`目录:编译后生成的APK和其他中间文件。 - `res`目录:存放应用资源,如布局、图片、字符串等。 - `assets`目录:...

Global site tag (gtag.js) - Google Analytics