2010-09-25 10 views
46

znajdę się robi takie rzeczy przez cały czas:Jeden OnClickHandler dla wielu przycisków

Button button1 = (Button) findViewById(R.id.button1); 
    Button button2 = (Button) findViewById(R.id.button2); 
    Button button3 = (Button) findViewById(R.id.button3); 

    button1.setOnClickListener(menuButtonListener); 
    button2.setOnClickListener(menuButtonListener); 
    button3.setOnClickListener(menuButtonListener); 
... 

i

private OnClickListener myButtonListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button1 : 
    ... 

Czy istnieje lepszy sposób, aby ustawić OnClickListener?

Odpowiedz

59

Możesz również ustawić go w swoim układzie xml za pomocą atrybutu android: onclick.

android:onClick="onClick" 

Następnie w swojej klasie aktywności dodaj metodę onClick.

public void onClick(View v) { 
... 

Oto documentation.

+0

Ah, nice :) Krótki i skuteczny. Lubię to! – mseo

+1

Co się stanie, jeśli przyciski są tworzone dynamicznie? – Orion

+1

@Orion Zarówno to podejście, jak i podejście mseo będą działać również w przypadku dynamicznie tworzonych przycisków. – Tiago

35

Wyraź swoją klasę realizować `View.OnClickListener”, jak

public class MyActivity extends Activity implements View.OnClickListener { 

    Button button1, button2, button3; 

    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(); 

     ... 

     button1 = (Button) findViewById(R.id.button1); 
     button2 = (Button) findViewById(R.id.button2); 
     button3 = (Button) findViewById(R.id.button3); 

     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      // do stuff; 
      break; 
      case R.id.button2: 
      // do stuff; 
      break; 
     ... 
    } 
} 
+1

Cóż ... nie oszczędza mi to dużo pracy. Jest to kolejna możliwość, ale nie jest tak naprawdę krótsza ani bardziej elegancka niż moje podejście. – mseo

+0

Wydaje się, że to działa dobrze w przypadku rozszerzeń aktywności – CelticParser

+0

! Jak to działa jednak ...? –

4

Należy zauważyć, że

android:onclick="onClick" 

wymaga co najmniej Andoid SDK 1.6. Jeśli chcesz, aby Twoja aplikacja była dostępna dla jak największej liczby odbiorców, prawdopodobnie chcesz napisać swoją aplikację na Androida 1.6. O ile Twoja aplikacja nie wymaga funkcji, która jest dostępna tylko w wersji 1.6+. Podczas gdy Twoja pierwsza próba to trochę więcej pracy, ma większą kompatybilność wsteczną. Zwykle robię to tak, jak to robisz, aby moja aplikacja była kompatybilna.

Edytuj: Edycja: Łatwo jest to przeoczyć, jeśli skonfigurujesz Androida 2.2 jako SDK w ustawieniach projektów, ale ustaw wersję minSDK na 3 (1.5), ponieważ nie daje błędów kompilatora.

1

myślę, że w przypadku, gdy przyciski nie są w działalności, ale w FragmentDialog itp, to może pomóc

Context mContext = getActivity().getBaseContext(); 
mRes = mContext.getResources(); 
String[] idOfButtons = { "button1", "button2", "button3"}; 
for (int pos = 0; pos < idOfButtons.length; pos++) { 
    Integer btnId = mRes.getIdentifier(idOfButtons[pos], "id",(getActivity()).getBaseContext().getPackageName()); 
    ImageButton ib = (ImageButton) v.findViewById(btnId); 
    ib.setOnClickListener(this.onClickNum); 
} 
5

Gettin @foenix odpowiedź, można po prostu zrobić coś takiego:

int[] buttons = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7 
      , R.id.button8, R.id.button9}; 
    for (int i = 0; i < buttons.length; i++) { 
     Button buttonNum = (Button) rootView.findViewById(buttons[i]); 
     buttonNum.setOnClickListener(doSomething); 
    } 

private OnClickListener doSomething= new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      //doSomething 
    } 
}; 
0

Jeśli chcesz zrobić mniej kodu dla słuchaczy click masz ten lib [http://jakewharton.github.io/butterknife/]

po prostu trzeba to zrobić

@OnClick({ R.id.button1, R.id.button2, R.id.button3 }) 
public void doSomething(View button) { 
    //do whatever you want 
    button.changeWhateverInTheView(); 
} 
Powiązane problemy