2011-10-24 13 views
20

Zacząłem program trochę w Androidzie, Mam 3 przyciski w jednym działaniu.Android jedna metoda OnClick dla wielu przycisków?

Widziałem kilka kodów przykład, który może przydzielić tego samego OnClick zdarzenie do wszystkich przycisków (nawet jeżeli wykonują zupełnie inne działanie) oraz w sposób Switch(id) case CASE ...

Co jest lepszym rozwiązaniem? jedna metoda i przełączanie lub wiele metod, po jednym dla każdego przycisku?

Dzięki.

Odpowiedz

19

Jeśli chcesz zmniejszyć linie kodowania następnie użyć View's OnClick() with switch statement i jeśli chcesz obsługiwać osobno wszystkie kliknięcia (na łatwe zrozumienie i utrzymanie kodu), a następnie użyć oddzielnego wszystkie button's onClick().

Aktualizacja:

Jeśli zadeklarowałeś przyciski w pliku xml Activity layout, a następnie wpisujesz atrybut android:onClick="" z tą samą nazwą metody dla wszystkich przycisków i zaimplementujesz tę metodę w swoim działaniu. Teraz masz jedną metodę dla wszystkich przycisków iw tej metodzie rozróżniać przyciski o identyfikatorze.

Przykład:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 
    <Button android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 1" /> 
    <Button android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 2" /> 
    <Button android:id="@+id/button3" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 3" /> 
</LinearLayout> 

Teraz w swojej działalności realizować buttonOnClick podobnego

public void buttonOnClick(View view) 
{ 
switch(view.getId()) 
{ 
    case R.id.button1: 
    // Code for button 1 click 
    break; 

    case R.id.button2: 
    // Code for button 2 click 
    break; 

    case R.id.button3: 
    // Code for button 3 click 
    break; 
} 
} 

Albo można zastosować tę samą obudowę przełącznika dynamicznie dodanych przycisków w swojej działalności, jak zamiast buttonOnClick musisz użyć zaimplementowanej View OnClickListerner'sonClick.

6
this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook); 
this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener); 

public OnClickListener backButtonClickListener = new OnClickListener() 
{ 
public void onClick(final View view) 
{ 
    if (view == MatchInfoActivity.this.btnBack) 
    { 
     MatchInfoActivity.this.finish(); 
    } 
    if(view == MatchInfoActivity.this.btnAddFried){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
    if(view == MatchInfoActivity.this.btnAddBuddy){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
} 
}; 

Oto dobra droga.

+0

Nie pyta, jak radzić sobie z kliknięciami, tylko z których dwóch znanych mu technik jest preferowany. – goto10

2

Myślę, że rejestracja onClick w xml (layout) jest lepszym podejściem.

EDIT:

Znaleziono Podobne wątki:

  1. Best practice for defining button events in android
  2. best practices for handling UI events
+0

Myślę, że trochę dziwnie jest umieścić go w XML, ponieważ jest to jedyne zachowanie interfejsu użytkownika, które działa w ten sposób. Może gdyby to było bardziej jak iOS, gdzie skonfigurowałbyś wszystkie programy obsługi UI od projektanta interfejsu użytkownika, miałoby to więcej sensu. – goto10

34

Stosować ten sposób:

@Override 
public void onCreate(Bundle savedInstanceState) { 
     button1.setOnClickListener(onClickListener); 
     button2.setOnClickListener(onClickListener); 
     button3.setOnClickListener(onClickListener); 
} 

private OnClickListener onClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.button1: 
        //DO something 
      break; 
      case R.id.button2: 
        //DO something 
      break; 
      case R.id.button3: 
        //DO something 
      break; 
     } 

    } 
}; 
+0

dlaczego używasz finału? –

+0

To jest metoda abstrakcyjna. Myślę, że nie musimy się tym przejmować. –

+0

Jak możemy to zrobić, jeśli mamy przyciski w różnych działaniach? – Bran

0

Zarejestrowany onClick zdarzenia w układzie XML, a następnie obsługiwać go w kodzie. To w jaki sposób to zrobić:

<Button 
android:id="@+id/btplus" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Click me" 
android:onClick="onBtnClicked"> 

Sposób.klasa

public void onBtnClicked(View v) { 
     switch (v.getId()) { 
     case R.id.btplus: 
      Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.btminu: 
      Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
     } 
    } 
0

Mały dodatek do odpowiedzi @Nguyen.

findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener); 
.... .... .... .... 
findViewById(R.id.buttonN).setOnClickListener(buttonClickListener); 

private View.OnClickListener buttonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.buttonOne: 
       // do something 
       break; 
      .... .... .... .... 
      case R.id.buttonN: 
       // do something 
       break; 
     } 
    } 
}; 

Może to być przydatne, jeśli nie chcesz inicjować zmiennej przycisku, ale chcesz śledzić zdarzenie kliknięcia przycisku. Dzięki!

Powiązane problemy