2009-10-01 11 views
40

Powiedzmy mam kilka przycisków w LinearLayout, 2 z nich są:Android: Użyj instrukcji SWITCH z setOnClickListener/onClick dla więcej niż 1 przycisku?

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

zarejestrować setOnClickListener() na obu z nich:

mycards_button.setOnClickListener(this); 
exit_button.setOnClickListener(this); 

Jak zrobić przejście na rozróżniać dwa przyciski w Onclick?

public void onClick(View v) { 
    switch(?????){ 
    case ???: 
     /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 
    case ???: 
     /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
} 
+0

wolę nie używać do tego menu, jak mogę umieścić przyciski gdziekolwiek chcę od układu ... – Hubert

Odpowiedz

103

Zastosowanie:

public void onClick(View v) { 

    switch(v.getId()){ 

     case R.id.Button_MyCards: /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 

     case R.id.Button_Exit: /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
    } 
} 

Należy pamiętać, że to nie będzie działać w projektach bibliotecznych Android (z powodu http://tools.android.com/tips/non-constant-fields), gdzie trzeba będzie użyć czegoś takiego:

int id = view.getId(); 
if (id == R.id.Button_MyCards) { 
    action1(); 
} else if (id == R.id.Button_Exit) { 
    action2(); 
} 
+0

prace po prostu super! Zastanawiam się, jak sam tego nie próbowałem! Wielkie dzięki, koleś. H. – Hubert

+0

Kiedy to zrobię, zaćmienie mówi mi: "wyrazy sprawy muszą być wyrażeniami stałymi" – dell116

+1

@ dell116 Mówi ci to, ponieważ zmienna, której używasz w przypadku, nie jest stała. Zadeklaruj zmienną, która narzeka na nią jako ostateczną, na przykład "' final int x = 5; '", lub zadeklaruj zmienną y "' final int y = x; '" tuż przed przełącznikiem, jeśli x musi zostać zmodyfikowane przed osiągnięciem walizka. – aggregate1166877

7

Inną opcją jest aby dodać nowy parametr OnClickListener jako parametr setOnClickListener() i przesłonić metodę onClick():

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

// Add onClickListener to mycards_button 
mycards_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Start new activity 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
}); 

// Add onClickListener to exit_button 
exit_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Display alertDialog 
     MyAlertDialog(); 
    } 
}); 
+5

Zawsze uważałem, że to naprawdę brzydkie –

+0

Podoba mi się, ale myślę, że to kwestia osobistych preferencji. – aspartame

+0

Nie, nie używaj go. Ponieważ za każdym razem używasz setOnclickListener (new OnclickLisener() {...}); Android tworzy nowy wątek, aby złapać akcję. Więc wyobraź sobie, jeśli masz 10 przycisków, masz 10 wątków, to nie jest dobre. – Cocorico

1

I jest jeszcze trzecia opcja. W metodzie onCreate() znajdź wszystkie dostępne widoki przycisków i zapisz je jako elementy danych klas. Następnie możesz kaskadować grupę instrukcji if-else, aby znaleźć, która jest która. To trochę nieporządne, ale jest koniecznością, jeśli nie znasz identyfikatora przycisków (co może być skomplikowane, jeśli generujesz przyciski w kodzie Java).

@Override 
public void onClick(View v) { 
    if (v == m_myCards) { 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
    else if (v == m_exit) { 
     MyAlertDialog(); 
    } 
    else if (v == m_back) { 
     finish();    
    } 

Kolejną zaletą tej techniki jest elastyczność i szybkość (brak konieczności analizowania identyfikatorów). Złe jest to, że musisz przechowywać widżety w pamięci.

Nie wiem, która metoda jest lepsza.

+1

Czy jest to również możliwe w przypadku instrukcji switch? – winklerrr

+0

@winklerrr - Nie, instrukcje switch w java wymagają stałych, a nie zmiennych. Dlatego w tym przykładzie użyto mniej eleganckiej serii instrukcji if-else. –

+0

A co jeśli zadeklarowałeś taką metodę: 'onClick (final View v)'? – winklerrr

2

wewnątrz metody OnCreate: -

{ 

    Button b = (Button)findViewById(R.id.button1); 
    b.setOnClickListener((View.OnClickListener)this); 

    b = (Button)findViewById(R.id.button2); 
    b.setOnClickListener((View.OnClickListener)this); 
} 

@Override 
public void OnClick(View v){ 

    switch(v.getId()){ 
     case R.id.button1: 
      //whatever 
      break; 

     case R.id.button2: 
      //whatever 
      break; 
} 
+0

Nie musisz przesyłać swojej aktywności do 'OnClickListener' jeśli implementuje interfejs' OnClickListener'. – winklerrr

5
public class MainActivity extends Activity 
     implements View.OnClickListener { 
    private Button btnForward, btnBackword, btnPause, btnPlay; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initControl(); 
    } 

    private void initControl() { 
     btnForward = (Button) findViewById(R.id.btnForward); 
     btnBackword = (Button) findViewById(R.id.btnBackword); 
     btnPause = (Button) findViewById(R.id.btnPause); 
     btnPlay = (Button) findViewById(R.id.btnPlay); 
     btnForward.setOnClickListener(this); 
     btnBackword.setOnClickListener(this); 
     btnPause.setOnClickListener(this); 
     btnPlay.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btnForward: 
       break; 
      case R.id.btnBackword: 
       break; 
      case R.id.btnPause: 
       break; 
      case R.id.btnPlay: 
       break; 
     } 
    } 
} 
+0

poprawnie formatuj kod –

Powiązane problemy