您的位置:首页 > 移动开发 > Android开发

观察者模式——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事件监听,我们来看一下对应关系,还是拿登录主界面的例子来举例。

先贴一段代码:

//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交互事件监听中的分析到此结束,文中有什么说的不对的地方还请大家勘误!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息