观察者模式——Android控件的交互事件监听
2016-03-06 16:18
459 查看
先来说一下Android控件的交互事件监听。
有过Android开发经验的人都知道Android控件的事件监听流程一般有如下几步:
1、首先在布局文件***.xml中定义某一控件,我们拿登录界面来举例吧,一般登录界面中会有两个EditText控件,一个Button控件,首先在login.xml文件中定义这几个控件的布局;
2、在对应的Activity(Activity中实现了OnClickListener接口)中实例化这三个控件,接着添加button.setOnclickListener(this);
3、在重写的onClick(View v)方法中获取该button的id,然后进行事件处理。
以前没考虑过为什么要这么做,只知道按部就班的实现,但是这几天看《Android开发精要》这本书,里面说到Android UI 设计中的UI交互事件监听遵循观察者模式,才对其设计进行了分析。试想,如果想知道具有状态变化属性的控件什么时候发生状态变化,我们总不能单独开个线程经常监听它吧?所以这时需要有个好的设计模式来解决这种情况,当控件状态发生变化时能主动将变化的状态推送给其他相关的类,那么观察者模式正好满足这种情况。
那么什么是观察者模式呢?首先我们来看一下介绍观察者模式都会贴的一张图:
这是来自wiki百科中的图片,Observer表示抽象的观察者,ConcreteObserver表示具体的观察者,实现了抽象观察者;Subject表示抽象主题,抽象主题相当于观察者要观察的一类对象,ConcreteSubject表示具体的主题,实现了抽象主题。具体到AndroidUI事件监听,我们来看一下对应关系,还是拿登录主界面的例子来举例。
先贴一段代码:
通过查看OnClickLister的声明,我们可以看到这个抽象观察者的接口方法:
对于观察者模式在Android交互事件监听中的分析到此结束,文中有什么说的不对的地方还请大家勘误!
有过Android开发经验的人都知道Android控件的事件监听流程一般有如下几步:
1、首先在布局文件***.xml中定义某一控件,我们拿登录界面来举例吧,一般登录界面中会有两个EditText控件,一个Button控件,首先在login.xml文件中定义这几个控件的布局;
2、在对应的Activity(Activity中实现了OnClickListener接口)中实例化这三个控件,接着添加button.setOnclickListener(this);
3、在重写的onClick(View v)方法中获取该button的id,然后进行事件处理。
以前没考虑过为什么要这么做,只知道按部就班的实现,但是这几天看《Android开发精要》这本书,里面说到Android UI 设计中的UI交互事件监听遵循观察者模式,才对其设计进行了分析。试想,如果想知道具有状态变化属性的控件什么时候发生状态变化,我们总不能单独开个线程经常监听它吧?所以这时需要有个好的设计模式来解决这种情况,当控件状态发生变化时能主动将变化的状态推送给其他相关的类,那么观察者模式正好满足这种情况。
那么什么是观察者模式呢?首先我们来看一下介绍观察者模式都会贴的一张图:
这是来自wiki百科中的图片,Observer表示抽象的观察者,ConcreteObserver表示具体的观察者,实现了抽象观察者;Subject表示抽象主题,抽象主题相当于观察者要观察的一类对象,ConcreteSubject表示具体的主题,实现了抽象主题。具体到AndroidUI事件监听,我们来看一下对应关系,还是拿登录主界面的例子来举例。
先贴一段代码:
//OnClickListener是一个接口,是抽象观察者,LoginActivity实现了这个接口,就变成了一个具体的观察者, //观察的对象就是UI对象(即主题) public class LoginActivity extends Activity implements OnClickListener{ private EditText et_username, et_password; private Button btn_forget_psd,btn_login_now, btn_goto_register; private CheckBox cb_remember_psd; //等待的对话框 private Dialog dialog = null; Intent intent = null; private String jsonStr; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_main); initView(); } private void initView() { et_username = (EditText)findViewById(R.id.et_username); et_password = (EditText)findViewById(R.id.et_password); btn_forget_psd = (Button)findViewById(R.id.btn_forget_psd); btn_login_now = (Button)findViewById(R.id.btn_login_now); cb_remember_psd = (CheckBox)findViewById(R.id.cb_remember_psd); btn_goto_register = (Button)findViewById(R.id.btn_goto_register); btn_forget_psd.setOnClickListener(this); //设置了登录按钮(具体的主题)设置监听这个操作(抽象主题中提供的操作) btn_login_now.setOnClickListener(this); cb_remember_psd.setOnClickListener(this); btn_goto_register.setOnClickListener(this); } //观察者中的操作 @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_forget_psd: intent = new Intent(LoginActivity.this,ForgetPasswordActivity.class); startActivity(intent); this.finish(); break; case R.id.btn_login_now: loginSubmit(); break; case R.id.cb_remember_psd: break; case R.id.btn_goto_register: intent = new Intent(LoginActivity.this, RegisterActivity.class); startActivity(intent); //this.finish(); default: break; } }</span>
通过查看OnClickLister的声明,我们可以看到这个抽象观察者的接口方法:
<span style="font-size:18px;"> /** * Interface definition for a callback to be invoked when a view is clicked. */ public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }</span>通过查看setOnClickListener(this)的声明,我们可以看到它属于View类的一个接口,View属于一个抽象主题,由此看来button就是一个具体的主题了:
<span style="font-size:18px;">/** * Register a callback to be invoked when this view is clicked. If this view is not * clickable, it becomes clickable. * * @param l The callback that will run * * @see #setClickable(boolean) */ public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } </span>当btn_login_now的状态发生变化时,比如被用户点击了,btn_login_now通过setOnClickListener()方法通知观察者,观察者通过OnClick()方法监听到这个动作,相关的类就可以进行相应处理了。
对于观察者模式在Android交互事件监听中的分析到此结束,文中有什么说的不对的地方还请大家勘误!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories