2011-09-28 58 views
14

我做了一个像Mybutton.java的自定义组件 ,我在Mybutton.java中设置了一个onclick监听器。android-多onClick监听器在一个按钮

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

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

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

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

+0

我不知道为什么你想有多个监听器,你能告诉我一个用例? – CommonMan

+0

MyButton.java究竟是什么?它是一个包含扩展android Button类的类的文件吗? –

回答

32

我不认为在Android API中有一个API允许多个onClick听众。您需要一些自定义类来处理单个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 **** 
    } 
}); 
+0

我试图让我的自定义类扩展Button并实现View.OnClickListener,但不幸的是实现方法onClick()was not fired:/ – BlueMan

+0

如果你正在实现一个新类,那么你需要通过它将其添加到View对象'setOnClickListener'。如果你直接覆盖View,那么你可以直接重写'onClick()'来处理它。 – DeeV

+0

我需要一些OnTouchListener,这节省了我一些时间!谢谢@DeeV – alchemist

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