问题描述:
自己做了一个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);
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(); } });