2009-10-01 17 views
40

Digamos que tengo un par de botones en un LinearLayout, 2 de ellos son:Android: ¿Utiliza una instrucción SWITCH con setOnClickListener/onClick para más de 1 botón?

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

me registro setOnClickListener() en ambos:

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

¿Cómo hago un interruptor para diferenciar entre la dos botones dentro de 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

prefiero no usar menús para esto, ya que puede poner los botones en cualquier lugar que desee a la presentación ... – Hubert

Respuesta

103

Uso:

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

Tenga en cuenta que esto no va a trabajar en proyectos de bibliotecas Android (debido a http://tools.android.com/tips/non-constant-fields) en la que tendrá que usar algo como:

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

obras simplemente genial! ¡Me pregunto cómo no lo he intentado solo! Muchas gracias amigo. H. – Hubert

+0

Cuando lo hago, este eclipse me dice: "las expresiones de caso deben ser expresiones constantes" – dell116

+1

@ dell116 Te lo está diciendo porque la variable que estás utilizando en el caso no es una constante. Declare la variable de la que se queja como definitiva, por ejemplo "' final int x = 5; '", o declare una variable y "' final int y = x; '" justo antes del cambio si x debe modificarse antes de llegar al caso. – aggregate1166877

7

Otra opción es para agregar un nuevo OnClickListener como parámetro en setOnClickListener() y anulando el método 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

Siempre he encontrado que ser realmente desordenado –

+0

Me gusta, pero creo que es más o menos una cuestión de preferencia personal. – aspartame

+0

No, no lo use. Porque cada vez que use setOnclickListener (nuevo OnclickLisener() {...}); Android crea un nuevo hilo para atrapar la acción. Así que imagina que si tienes 10 botones, tienes 10 hilos, eso no es bueno. – Cocorico

1

Y todavía hay una tercera opción. En su método onCreate(), encuentre todas las vistas de botón que tenga y guárdelas como miembros de datos de clase. Luego puede conectar en cascada un grupo de declaraciones if-else para encontrar cuál es cuál. Es un poco desordenado, pero es imprescindible si no conoces la ID de los botones (lo cual puede ser complicado si estás generando botones en código 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();    
    } 

Otra cosa buena de esta técnica es que es flexible y rápida (sin tener que analizar los identificadores). Lo malo es que debes mantener los widgets en la memoria.

No sé qué método es mejor.

+1

¿Eso también es posible con una declaración de cambio? – winklerrr

+0

@winklerrr - No, las sentencias switch en java requieren constantes, no variables. Es por eso que este ejemplo utiliza la serie menos elegante de declaraciones if-else. –

+0

¿Y qué ocurre si declaras el método de esta manera: 'onClick (vista final v)'? – winklerrr

2

dentro método 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

No necesita enviar su actividad a un 'OnClickListener' si implementa la interfaz' 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

formatee el código correctamente –

Cuestiones relacionadas