2011-09-28 110 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. 
     } 
    });