Gestionar múltiples OnClicks en un sólo listener

Ya sabemos que para gestionar las acciones a realizar cuando el usuario pulsa en un botón o vista en general, podemos añadir una función que vincularemos con la propiedad onClick del botón o vista en el editor visual.

<Button
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="@string/self_destruct"
     android:onClick="miOnClick" />

y crear la función miOnClick(View v) asi:

public void miOnClick(View view) {
     // codigo a ejecutar al ser pulsado
     // el parámetro view es el objeto View que se ha pulsado
 }

También sabemos que añadiendo el siguiente código, lo que hacemos es definir un Listener para el botón en tiempo de ejecución, de forma que cuando el usuario pulse en el botón o vista, el listener (su método onClick) será llamado por Android.

 

Pero, ¿que pasa si tengo un montón de botones y cada uno quiero que responda de una forma diferente o bien hacer algo distinto con ellos?  ¿Tengo que definir múltiples funciones y asociarlos a las propiedades de cada botón, o definir múltiples listeners, uno para cada botón?

Podremos gestionar todos los clicks desde un único listener de varias formas.

La primera es crear una única función que recibe un parámetro View v, que será el botón que se ha pulsado. Lo que habrá que hacer dentro del código de la función es utilizar un switch para determinar la vista de que se trata.

Pero el inconveniente de esta solución es que tengo que añadir en la propiedad onClick de cada botón el nombre de la función. Al menos tengo una única función, pero sigo teniendo que modificar muchos botones en el editor visual o en el xml asociado a la activity donde residen los botones.

El segundo método es implementar el interfaz View.OnClickListener en la activity correspondiente con el siguiente código:

public class MainActivity extends AppCompatActivity implements 
View.OnClickListener {
}

Una vez que hemos declarado que la activity implementa el interfaz, hay que implementarla. Lo primero es capturar, en el onCreate() de la activity, el objeto button de cada botón y ejecutar su método setOnClickListener pasando el propio objeto como parámetro, es decir, el método onClick() que llamamos será instanciado en la misma clase. Esto lo hacemos así:

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

        Button btnOne = (Button) findViewById(R.id.btnOne);
        Button btnTwo = (Button) findViewById(R.id.btnTwo);
        Button btnThree = (Button) findViewById(R.id.btnThree);
        btnOne.setOnClickListener(this); // calling onClick() method
        btnTwo.setOnClickListener(this); 
        btnThree.setOnClickListener(this); 
    }

Ahora toca sobrecargar el méoto onClick de la interfaz en nuestra clase. Este es el que se llama porque pasamos (this) como parámetro al llamar al setOnClickListener para cada botón

    @Override
    public void onClick(View v) {
     // handling onClick Events
    }

y el código que discrimina lo que hacer al pulsar cada botón querdaría asi:

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.btnOne:
                // code for button when user clicks btnOne.
                break;

            case R.id.btnTwo:
                // do your code
                break;

            case R.id.btnThree:
                // do your code
                break;

            default:
                break;
        }
    }