- 浏览: 514732 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
u010169720:
而且fragment调用back也有不需要finish的时候呢 ...
android异常:Can not perform this action after onSaveInstanc -
u010169720:
我这里就是拦截的,但是还是报了这个
android异常:Can not perform this action after onSaveInstanc -
Salijing:
IT之冕 写道 我的方法是注释掉super.onBackPre ...
android异常:Can not perform this action after onSaveInstanc -
cainiao1923:
上线毛啊,Bad request了
基于NodeJs开发的独立博客系统~~上线啦 -
cainiao1923:
不错 !!!!!!!!!!!!!!
在Android上实现Java和Js交互
在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中,并于布局文件中引用即可,这样子实现响应的代码就与控制的代码分离了,结构更清晰,维护更简单,当然也符合对修改封闭,对扩展开放的原则!
发表评论
-
【翻译】 Android上实现文字围绕图片的布局
2014-04-09 16:31 3419在这边文章中,我将会介绍如何去实现一个在An ... -
【翻译】Android多线程下安全访问数据库
2014-04-08 11:21 11480为了记录如何线程安全地访问你的Android数 ... -
Android Robotium小结
2014-03-17 15:41 2342Robotium 是一款基于Android instrum ... -
Monkeyrunner小结
2014-03-15 23:49 6539Monkeyrunner----Android tools ... -
Android开发陷阱:利用PendingIntent传递唯一的Intent
2013-11-07 11:36 42141PendingIntent 是对真实 ... -
Android开发陷阱:利用PendingIntent传递唯一的Intent
2013-11-07 11:29 0PendingIntent 是对真实 ... -
GridView的特殊派生应用
2013-11-06 17:07 2151一、ScrollView + GridView 在Sc ... -
Android的ps命令介绍和技巧
2013-07-05 18:37 6663在Linux下,ps是非常普 ... -
在Android上实现Java和Js交互
2013-07-05 18:34 28262其实webview加载资源的速度并不慢,但是如果资源多 ... -
TextView的日常使用技巧
2013-07-05 18:29 5043Textview在日常开发工作中使用非常频繁,在这里 ... -
Android NDK开发之Jni调用Java对象
2013-03-16 00:11 26430本地代码中使用Java对 ... -
Android NDK开发之数组类型的操作
2013-03-16 00:05 8840Jni 可以通过JNIEnv提供的方法,对传过来的Java ... -
Android NDK开发之Jni的数据类型
2013-03-16 00:03 11393在前面的一篇博客《And ... -
Android NDK开发简介
2013-03-07 15:12 5913最近由于项目的 ... -
Android的NDK开发~SQLite3
2013-02-05 14:02 0What? NDK的N,即native,NDK开发,是指使 ... -
Android的NDK开发~Hellow world!
2013-02-05 13:52 24541、到Google官网下载adt- ... -
关于SD卡管理的注意事项
2013-01-18 11:24 11901问题: 本人一直有使 ... -
Activity流程控制之startActivityForResult
2012-10-18 09:48 0startActivityForResult不能与flag I ... -
Json解析之Gson库
2012-09-24 11:46 25572Json(JavaScript Object Notation ... -
搞定个性化输入提示--自定义AutoCompleteTextView
2012-09-04 14:44 5059在设计app的输入界面时,假如假如智能提示,给用户带来的不只是 ...
相关推荐
封装的一些关于sharePreference的方法
下面我们将详细介绍如何在Android应用中进行SharePreference的简单使用。 ### 1. 获取SharePreference实例 在Android应用中,我们首先需要获取到SharePreference的实例。这通常在Activity或Fragment中进行。有两种...
`SharePreference`是Android提供的一种轻量级的数据存储机制,主要用于存储简单的键值对数据,如布尔值、整型、浮点型、字符串等。这些数据通常以XML格式保存在设备的沙盒文件系统中,易于读写且持久化。 #### (1) ...
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/...
它提供了一种简单的方式来保存和检索应用程序的配置设置或任何其他简单的键值对数据。这个名为"sharepreference删除文件数据不会丢失.rar"的压缩包文件可能包含了关于如何在SharedPreferences中处理数据删除和恢复的...
在Android开发中,`SharedPreferences` 是一个非常重要的轻量级数据存储机制,它主要用于存储一些简单的配置信息,如用户设置、应用状态等。这个“Sharepreference”主题涉及到的是对`SharedPreferences`进行代码...
在Android开发中,序列化(Serialization)是一种将对象转换为可传输或存储格式的过程,而SharedPreferences则是一个轻量级的数据存储机制,常用于保存应用程序的简单配置数据。本篇文章将详细探讨如何将Android序列...
SharedPreferences是Android提供的一种轻量级的数据存储机制,它允许我们保存和读取简单的键值对数据,如字符串、整型、布尔值等。 首先,了解SharedPreferences的工作原理。SharedPreferences是基于XML文件存储的...
SharedPreferences是基于XML文件存储的,这些文件存储在应用的私有数据目录下,通常只有该应用有权限访问。然而,如果我们想要在不同的应用程序之间共享数据,我们需要进行一些额外的设置。 1. **创建共享的...
在这个"SharePreference音本应用"中,我们将探讨如何利用`SharedPreferences`来存储和读取数据,以及在实际应用场景中的使用技巧。 `SharedPreferences`是一个接口,它提供了键值对存储的方式,支持基本数据类型如...
综上所述,基于Android的解谜游戏设计与实现涉及多方面知识和技术,不仅要求开发者具备扎实的技术功底,还需要具备良好的创意和用户体验意识。通过不断的测试与优化,可以开发出既有趣又有教育意义的移动游戏。
此工程较BaiduLocationXML相比: 1.植入fragment,结合微信UI 2.在原本主界面的button textview textview 移植到Fragment1 3.增加网络判断,网络不通的情况下做另外处理 4.在网络通畅的情况下,将地址信息、天气信息...
【Android 毕业设计】基于 Android 的解谜游戏开发是一项综合性的软件工程实践,旨在让学生在毕业设计中深入理解Android应用开发技术,并将其应用于实际的游戏制作中。本设计主要涵盖了以下几个关键知识点: 1. **...
很好用的工具类,使用sharepreference存储数据,节省程序员开发时间
不同于文件的存储方式,SharePreference是使用键值对的方式来存储数据的。也就是说 当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以 通过键把相应的值取出来。
在Android开发中,SharePreferences是用于存储轻量级数据的关键组件,它被广泛用来持久化应用的设置或用户偏好。SharePreferences与JavaEE中的session有某些相似之处,但它们的本质和用途有所不同。在这个讨论中,...
本教程将基于Eclipse IDE V4.2.0,通过一个实例详细讲解如何使用SharePreferences来实现数据的持久化存储。 **一、SharePreferences简介** SharePreferences通常用来存储一些简单的键值对数据,如字符串、整型、...
- `AndroidManifest.xml`:应用的清单文件,包含了应用的元数据,如权限、组件声明等。 - `bin`目录:编译后生成的APK和其他中间文件。 - `res`目录:存放应用资源,如布局、图片、字符串等。 - `assets`目录:...