2011-09-28 13 views
14

Zrobiłem niestandardowy składnik, taki jak Mybutton.java i ustawiłem odbiornik onclick w Mybutton.java.Android - multi onClick Listener w jednym przycisku

Teraz, w mojej nowej działalności, muszę zadzwonić do Mybutton i dodać zawartość w odbiorniku onclick.

Jednak jeśli użyję OnClickListener mClickListener = new OnClickListener(){...... , zastąpi on starą zawartość. Mam nadzieję, że może to zrobić stary i nowy słuchacz razem.

Szukałem informacji, dowiedziałem się, że mogę wdrożyć tę metodę. Po wielu próbach nadal otrzymuję błędy.

Czy ktoś może dać mi prosty przykład , że mogę nauczyć się go modyfikować?

+0

Nie jestem pewien, dlaczego chcesz mieć wiele słuchacza, możesz mi powiedzieć przypadek użycia? – CommonMan

+0

Czym dokładnie jest MyButton.java? Czy jest to plik zawierający klasę, która rozszerza klasę przycisków Android? –

Odpowiedz

32

Nie sądzę, że w interfejsie API systemu Android istnieje interfejs API, który umożliwia wielu słuchaczy onClick. Potrzebowałbyś niestandardowej klasy, która obsłuży pojedyncze onClick() i przekaże funkcje obsługi, aby zadzwonić. Coś takiego:

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

jeżeli ustawienie przycisków, wykonaj następujące czynności:

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

Potem, gdy chcesz dodać kolejną słuchacza, zadzwoń

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

Próbowałem zrobić moją niestandardową klasę, która rozszerza Button i implementuje View.OnClickListener, ale niestety metoda narzędzia onClick() nie została uruchomiona:/ – BlueMan

+0

Jeśli implementujesz nową klasę, musisz dodać ją do obiektu View przez 'setOnClickListener'. Jeśli zastępujesz widok bezpośrednio, możesz bezpośrednio zastąpić 'onClick()', aby go obsłużyć. – DeeV

+0

Potrzebowałem czegoś takiego dla OnTouchListener, to zaoszczędziło mi trochę czasu! Dzięki @DeeV – alchemist

4

Można tworzyć niestandardowe Button klasy coś takiego:

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

    } 

i używać go tak:

// 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. 
     } 
    }); 
Powiązane problemy