Android - 两个onClick监听器和一个按钮

5 android event-bubbling

我有一个可点击的自定义TextView.它定义了自己的onClick处理程序,以便根据点击次数更改其外观.但是,如果我在我的活动中定义第二个onClick处理程序,以便根据被单击的按钮执行某些操作,则只调用其中一个onClick函数.onClick是一个void函数 - 有没有办法说我没有处理这个点击,请把它传递给其他onClick处理程序?

这里要更清楚的是代码:

在扩展TextView的MyCheckButton里面我有:

    setOnClickListener( mClickListener );

    private OnClickListener mClickListener = new OnClickListener() {
        public void onClick(View v) {
            toggle();
        }
    };
Run Code Online (Sandbox Code Playgroud)

但是我将MyCheckButton包含到我的Activity中,当然我需要在点击它时做一些事情,所以我将另一个OnClickListener附加到它:

MyCheckButton button= (MyCheckButtonButton) findViewById(R.id.cb);
button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        // do something in the app
    }

});
Run Code Online (Sandbox Code Playgroud)

通过调用setOnClickListener两次,看起来我正在替换原始侦听器,因此更改外观的toggle()永远不会被调用.如果单击此按钮已经使用onClick处理程序更改其外观,如何在我的活动中执行某些操作?我以为我只会看到两个OnClickListeners被调用.

Chr*_*son 6

这有点脏,但是如果你需要多个监听器我会这样做的方法是注册一个知道另一个的人.第一个(实际注册的那个)将需要知道何时根据事件的条件委托给另一个监听器.实际上,实际上,没有必要有两个OnClickListener班级.第二个类可以实现您想要的任何接口.此外,您无需为所需内容创建特殊界面.

public class MyClickListener implements OnClickListener{
  private SomeCustomClass mSecondListener = new SomeCustomClass();
  public void onClick(View v){
    if (needToForward){
      mSecondListener.handleClick(v);
    }else{
      //handle the click
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的活动代码中,您将执行此操作

MyClickListener lstn = new MyClickListener();
mCheckBox.setOnClickListener(lstn);
Run Code Online (Sandbox Code Playgroud)

这有什么理由不适合你吗?

或者,如果您愿意,第二个类也可以实现该OnClickListener接口.

此外,如果您需要真正的冒泡,您可以定义自己的接口,该接口支持将多个单击侦听器添加到恰好实现OnClickListener接口的中间类.从那里,在该类的onClick()方法中,您将遍历已注册的侦听器,并调用适当的方法.