android-多onClick监听器在一个按钮

时间:2011-09-28 17:41:45

标签: android onclick listener

我制作了一个像Mybutton.java这样的自定义组件 我在Mybutton.java中设置了一个onclick监听器。

现在,在我的新活动中,我必须打电话给Mybutton 并在onclick监听器中添加内容。

但是,如果我使用OnClickListener mClickListener = new OnClickListener(){...... 它将取代旧内容。 我希望它可以一起做新旧听众。

我搜索了一些信息,发现我可以实现这个方法。 经过多次尝试,我仍然遇到错误。

任何人都可以给我一个简单的例子 我可以学习修改它吗?

3 个答案:

答案 0 :(得分: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 :(得分:4)

您可以创建自定义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 :(得分:0)

如果您想在自定义视图的onClick中执行一些内部逻辑,并希望执行外部设置的OnClickListener的逻辑,那么我认为一种简单的方法是覆盖setOnClickListener,如下所示。

在科特林:

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);
}