Android中一个控件添加多个监听方法(监听的追加,而非覆盖)

问题描述:


自己做了一个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;
	}

5、客户端使用。bar是新控件的实例。
		//通过监听器设置接口函数设置事件,这里决定不屏蔽原有事件。
		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();
			}
		});

结果:
上述代码分别设置了后退按钮的默认事件(弹出“”),通过监听设置接口设置的事件(弹出“”),通过监听追加函数追加的事件(弹出“”)。
实践证明,单击后退按钮后,依次弹出以上3条消息。
问题解决。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KwCoding

谢了老板您讷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值