2009-10-01 7 views
40

Disons que j'ai quelques boutons dans un LinearLayout, 2 d'entre eux sont:Android: Utilisez une instruction SWITCH avec setOnClickListener/onClick pour plus d'un bouton?

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

je me inscrire setOnClickListener() sur les deux:

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

Comment puis-je faire un interrupteur pour différencier entre la deux boutons dans le 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

Je préfère ne pas utiliser les menus pour cela, que je peux mettre les boutons partout où je veux sur la mise en page ... – Hubert

Répondre

103

Utilisation:

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

Notez que cela ne fonctionnera pas dans les projets de bibliothèque Android (en raison de http://tools.android.com/tips/non-constant-fields) où vous aurez besoin d'utiliser quelque chose comme:

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

fonctionne tout simplement génial! Je me demande comment je n'ai pas essayé cela tout seul! Merci beaucoup mec. H. – Hubert

+0

Quand je fais cela, l'éclipse me dit: "les expressions de cas doivent être des expressions constantes" – dell116

+1

@ dell116 Cela vous dit que parce que la variable que vous utilisez n'est pas une constante. Déclarer la variable dont il se plaint comme final, par exemple "' final int x = 5; '", ou déclarer une variable y "' final int y = x; '" juste avant le commutateur si x doit être modifié avant d'atteindre le Cas. – aggregate1166877

7

Une autre option est pour ajouter un nouveau OnClickListener en tant que paramètre dans setOnClickListener() et en remplaçant la méthode 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

J'ai toujours trouvé que c'est vraiment désordonné –

+0

J'aime ça, mais je suppose que c'est plutôt une question de préférence personnelle. – aspartame

+0

Non, ne l'utilisez pas. Parce que chaque fois que vous utilisez setOnclickListener (new OnclickLisener() {...}); Android crée un nouveau fil pour attraper l'action. Alors imaginez que si vous avez 10 boutons, vous avez 10 threads, ce n'est pas bon. – Cocorico

1

Et il y a encore une troisième option. Dans votre méthode onCreate(), recherchez toutes les vues de bouton dont vous disposez et enregistrez-les en tant que membres de données de classe. Vous pouvez ensuite mettre en cascade un groupe d'instructions if-else pour trouver lequel est quoi. C'est un peu compliqué, mais c'est un must si vous ne connaissez pas l'ID des boutons (ce qui peut être compliqué si vous générez des boutons en code 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();    
    } 

Une autre bonne chose à propos de cette technique est qu'elle est flexible et rapide (sans avoir à analyser les ID). La mauvaise chose est que vous devez garder les widgets en mémoire.

Je ne sais pas quelle méthode est la meilleure.

+1

Est-ce aussi possible avec une instruction switch? – winklerrr

+0

@winklerrr - Non, les instructions switch dans java nécessitent des constantes, pas des variables. C'est pourquoi cet exemple utilise la série moins élégante d'instructions if-else. –

+0

Et si vous déclariez la méthode comme ceci: 'onClick (vue finale v)'? – winklerrr

2

intérieur méthode 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

Vous n'avez pas besoin de transformer votre activité en 'OnClickListener' si elle implémente l'interface' 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

formatez le code correctement –

Questions connexes