2011-09-28 16 views
14

Ho creato un componente personalizzato come Mybutton.java e ho impostato un ascoltatore onclick in Mybutton.java.android- multi ascoltatore onClick in un pulsante

Ora, nella mia nuova attività, devo chiamare un Mybutton e aggiungere contenuto nel listener di onclick.

Tuttavia, se uso OnClickListener mClickListener = new OnClickListener(){...... che andrà a sostituire il vecchio contenuto. Spero che possa fare insieme il vecchio e il nuovo ascoltatore.

Ho cercato alcune informazioni, ho scoperto che posso implementare questo metodo. Dopo molti tentativi, sto ancora ricevendo errori.

Qualcuno può darmi un semplice esempio che posso imparare a modificarlo?

+0

Io non so perché si vuole avere chi ascolta più, puoi dirmi un caso d'uso? – CommonMan

+0

Che cosa è esattamente MyButton.java? È un file che contiene una classe che estende la classe Button di Android? –

risposta

32

Non penso che ci sia un'API nell'API Android che consente più listener onClick. Avresti bisogno di una classe personalizzata che gestisca un singolo onClick() e ti passi i gestori per chiamare. Qualcosa di simile a questo:

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

Quando la vostra impostazione i pulsanti, fare:

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

Poi, ogni volta che si desidera aggiungere un altro ascoltatore, basta chiamare

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

Stavo provando a creare la mia classe personalizzata che estende Button e implementa View.OnClickListener, ma sfortunatamente il metodo implement non è stato attivato onClick():/ – BlueMan

+0

Se stai implementando una nuova classe, devi aggiungerla all'oggetto View tramite 'setOnClickListener'. Se stai sovrascrivendo una vista direttamente, puoi eseguire l'override di 'onClick()' direttamente per gestirlo. – DeeV

+0

Avevo bisogno di qualcosa del genere per OnTouchListener, questo mi ha fatto risparmiare un po 'di tempo! Grazie @DeeV – alchemist

4

È possibile creare la vostra abitudine Button classe qualcosa del genere:

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

    } 

e, usare in questo modo:

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