安卓- 一个按钮内多个onClick监听器

16

我已经制作了一个自定义组件,名为Mybutton.java,并在其中设置了一个onclick监听器。

现在,在我的新活动中,我需要调用Mybutton并在其onclick监听器中添加内容。

但是,如果我使用OnClickListener mClickListener = new OnClickListener(){......,它会替换旧内容。我希望旧的和新的监听器能够一起工作。

我已经搜索了一些信息,发现可以实现这种方法。但是,尝试了很多次后,我仍然遇到错误。

有人能给我提供一个简单的示例,以便我学习修改吗?


我不确定为什么你想要多个监听器,你能告诉我一个使用案例吗? - CommonMan
MyButton.java到底是什么?它是一个包含了继承Android Button类的类的文件吗? - Arnab Chakraborty
3个回答

35

我认为在Android API中没有允许多个onClick监听器的API。你需要一些自定义类来处理单个onClick(),并传递处理程序以供其调用。例如:

private class CompositeOnClickListener implements View.OnClickListener{
    List<View.OnClickListener> listeners;

    public CompositeOnClickListener(){
        listeners = new ArrayList<View.OnClickListener>();
    }

    public void addOnClickListener(View.OnClickListener listener){
        listeners.add(listener);
    }

    @Override
    public void onClick(View v){
       for(View.OnClickListener listener : listeners){
          listener.onClick(v);
       }
    }
}

在设置按钮时,请执行以下操作:

CompositeOnClickListener groupListener = new CompositeOnClickListener();
myButton.setOnClickListener(groupListener);

然后,每当你想要添加另一个监听器时,只需调用

groupListener.addOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View v){
      **** Custom implementation ****
   }
});

1
我试图创建一个自定义类,它扩展了Button并实现了View.OnClickListener,但不幸的是,实现方法onClick()没有被触发 :/ - BlueMan
如果你正在实现一个新类,那么你需要通过 setOnClickListener 将它添加到 View 对象中。如果你直接覆盖了一个 View,那么你可以直接重写 onClick() 来处理它。 - DeeV
我需要类似于OnTouchListener的东西,这为我节省了一些时间!谢谢@DeeV - alchemist

5
您可以创建自定义的Button类,类似于以下内容:
    public class MyButton extends Button {

    private CustomOnClickListener mCustomOnClickListener;

    public interface CustomOnClickListener {
        void onClick(View v);
    }


    public MyButton(Context context) {
        super(context);

        // Set your own onClickListener
        View.OnClickListener ocl = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Do whatever you want to do

                // Invoke the other added onclick listener
                if(mCustomOnClickListener != null) {
                    mCustomOnClickListener.onClick(v);
                }
            }
        };
        setOnClickListener(ocl);
    }

    // use this function to set the other onclick listener
    public void setCustomOnClickListener(CustomOnClickListener cl) {
        mCustomOnClickListener = cl;
    }

    }

并且,使用它的方式如下:
    // create your button
    MyButton button = new MyButton(context);
    // add your custom onClickListener
    button.setCustomOnClickListener(new MyButton.CustomOnClickListener() {
        @Override
        public void onClick(View v) {
            // Do whatever you intend to do after the actual onClickListener
            // from MyButton class has been invoked.
        }
    });

2
如果您想在自定义视图的onClick中执行一些内部逻辑,并且想要执行外部设置的OnClickListener的逻辑,我认为一个简单的方法是按以下方式重写setOnClickListener。
在Kotlin中:
override fun setOnClickListener(externalOnClickListener: View.OnClickListener?) {
    val internalOnClickListener = View.OnClickListener { view -> 
        //Your awesome internal logic
        externalOnClickListener?.onClick(view)
    }
    super.setOnClickListener(internalOnClickListener)
}

在Java中相同:

@Override
public void setOnClickListener(@Nullable final View.OnClickListener externalOnClickListener) {
    View.OnClickListener internalOnClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            //Your awesome internal logic
            if (externalOnClickListener != null) {
                externalOnClickListener.onClick(view);
            }
        }
    };
    super.setOnClickListener(internalOnClickListener);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接