问题描述:
自己做了一个ActionBar控件,ActionBar上方有许多按钮,按钮有默认的单击事件。
既然是控件,就是为了重用,因此,对控件的事件监听有如下要求:
1、允许完全重设按钮监听(覆盖掉原来的事件,只监听新的事件,默认的事件不触发)
2、允许保留原有监听,追加新的监听(默认的事件触发,新加的事件也触发)
一个具体例子表示“追加监听”的问题:
大家都知道按钮Button的监听OnClickListener,设置方法为btn1.setOnClickListener(listener),这只能设置listener这一个监听。
现在假设listener1 实现弹出“你好”,listener2实现弹出“再见”
现在要求btn1设置 listener1,listener2 两个监听,从而实现:单击btn1时,依次弹出“你好”和“再见”。
(这里listener1 listener2就可以分别代表控件默认监听和追加的新监听)
解决办法:
http://bbs.csdn.net/topics/391829673
这是我的问题贴,版主大人sagittarius1988 一句话:“重写控件响应,list保存OnClickListener”,解决了我的问题。
说具体一点就是:若想让Button可以追加监听:
1、添加一个addOnClickListener(listener)方法,将追加的监听加入一个list;
2、可以将控件的默认监听加到list
3、重写原有控件的响应函数,依次执行一次list中的监听的方法。顺序的话按照业务需求定了。
*4、默认事件可选触发。可以根据添加监听的函数返回值来选择默认事件是否触发。
代码展示(示例作用,仅部分代码):
1、添加一个addOnClickListener(listener)方法,将追加的监听加入一个list;
// 后退按钮监听器列表
private ArrayList<OnClickListener> backClickListeners = new ArrayList<View.OnClickListener>();
// 追加后退按钮监听
public void addOnBackButtonClickListener(OnClickListener listener) {
backClickListeners.add(listener);
}
2、定义后退按钮默认事件:弹出“defaultClickListener”
// 默认控件单击事件
OnClickListener defaultClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibtnBack: {
Toast.makeText(mContent, "defaultClickListener",
Toast.LENGTH_SHORT).show();
break;
}
default:
break;
}
}
};
3、重写控件的响应监听
OnClickListener overrideListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibtnBack: {
boolean cancel = false;
if (listener != null) {
cancel = listener.OnBackButtonClick(v);//监听设置函数的返回值(见第4步),表示是否屏蔽控件默认事件,true屏蔽,false不屏蔽
}
if (!cancel) {//根据返回值选择是否触发默认事件
defaultClickListener.onClick(v);
}
//执行追加的所有监听
for (OnClickListener listener : backClickListeners) {
listener.onClick(v);
}
break;
}
default:
break;
}
}
};
//将overrideListener设置给要重写监听的按钮
ibtnBack.setOnClickListener(overrideListener);
*4、监听设置接口,方便用户重新设置ActionBar的后退按钮的事件。OnBackButtonClick的返回值决定了后退按钮的默认事件是否触发。
OnMyActionBarClickListener listener = null;
public interface OnMyActionBarClickListener {
/**
* 后退按钮单击事件
*
* @param view
* @return 是否屏蔽MyActionBar原有事件,true屏蔽,false不屏蔽
*/
public boolean OnBackButtonClick(View view);
}
public void setOnMyActionBarClickListener(
OnMyActionBarClickListener listener) {
this.listener = listener;
}
//通过监听器设置接口函数设置事件,这里决定不屏蔽原有事件。
bar.setOnMyActionBarClickListener(new OnMyActionBarClickListener() {
@Override
public boolean OnBackButtonClick(View view) {
Toast.makeText(PasswordActivity.this,
"setOnMyActionBarClickListener", Toast.LENGTH_SHORT)
.show();
return false;
}
});
//监听器追加函数,追加一个监听器
bar.addOnBackButtonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(PasswordActivity.this, "addOnBackButtonClickListener",
Toast.LENGTH_SHORT).show();
}
});