back to top

Un listener ottimizzato per gestire i click sui nostri bottoni – Guida Sviluppo App Android

Nel precedente capitolo non è stata volutamente offerta al lettore una versione ottimizzata della procedura di configurazione di un listener, in quanto si è preferito illustrarne prima le basi di funzionamento al fine di non generare confusione e di seguire un percorso lineare di esposizione. Da un punto di vista prettamente implementativo, tuttavia, il codice esposto in precedenza, come già detto, non risulta certamente la soluzione preferibile.

Quello che andremo a vedere ora, quindi, è una implementazione ottimizzata del nostro listener mediante la creazione di un oggetto OnClickListener da invocare su entrambi i bottoni mediante il metodo setOnClickListener.

Posizioniamoci, quindi, nuovamente nel file MainActivity.java ed inseriamo il seguente codice:

View.OnClickListener gestore = new View.OnClickListener() {
  public void onClick(View view) {    
    switch(view.getId()) {         
      case R.id.bottone1:
        textView1.setText("E' stato cliccato il bottone 1 !!!!!");
        break;              
      case R.id.bottone2:
        textView1.setText("E' stato cliccato il bottone 2  !!!!!");
        break;
    }
  }
};
        
bottone1.setOnClickListener(gestore);
bottone2.setOnClickListener(gestore);

Dunque, come prima cosa viene creato un oggetto di tipo OnClickListener e, dopo il costrutto new, viene invocato il costruttore relativo alla classe andando poi a ridefinire il metodo OnClick come abbiamo fatto precedentemente.

Il listener che abbiamo creato ha la particolarità di essere lo stesso per entrambi i bottoni e dunque, rispetto all’implementazione precedente, abbiamo risparmiato la memoria relativa ad una nuova istanza di un listener. Il vantaggio è ancor più evidente al crescere del numero di bottoni all’interno della finestra grafica.

In sostanza il listener è in grado di capire quale dei due bottoni è stato cliccato agendo di conseguenza. Il riconoscimento del bottone premuto avviene utilizzando un costrutto switch basato sulla condizione view.getId().

Come possiamo vedere il metodo OnClick ha come argomento una View e dunque, quando un bottone viene cliccato, l’oggetto View viene inizializzato con il bottone premuto. Utilizzando il metodo getId() ritorniamo l’id univoco associato al bottone presente nel file R.java che abbiamo visto nei capitolo precedenti.

A questo punto è possibile distinguere il bottone premuto sulla base dell’id del bottone, come possiamo ben vedere nel costrutto case.

Terminato il codice relativo al metodo OnClick viene invocato il metodo setOnClickListener su entrambi i bottoni passandogli come argomento proprio l’OnClickListener creato precedentemente.

Una volta capito, il codice mostrato in questo capitolo risulta di facile utilizzo e di facile modifica. Infatti questa implementazione, oltre a consentire un minor uso della memoria (aspetto non trascurabile quando si programma per dispositivi con memoria molto limitata come un telefono) ha il grande vantaggio di essere facilmente manutenibile. Questo perchè se avessimo l’esigenza di modificare il comportamento del listener sapremmo precisamente che parte del codice andare ad editare. Stessa cosa non si può dire se utilizzassimo la vecchia implementazione perchè, in quel caso, dovremmo scorrere tutto il codice alla ricerca di ogni elemento che utiizza un listener per poi andarne a modificare il codice all’interno.

L’implementazione migliorata risulta anche facilmente espandibile in quanto se avessimo la necessita di inserire un altro bottone che utilizza lo stesso listener sarà sufficiente seguire i seguenti passi:

  1. Dichiariamo il bottone all’interno del file activity_main.xml.
  2. Nella nostra activity dichiariamo un altro attributo di tipo Button.
  3. Associamo all’attributo l’elemento dichiarato nel file activity_main.xml.
  4. Nel metodo Onclick del listener inseriamo un nuovo case inserendo il codice relativo al comportamento voluto per quel bottone.
  5. Associamo al bottone il listener con il metodo setOnClickListener.

Come potete vedere è tutto molto più semplice e, quindi, senza dubbio preferibile alla soluzione vista nel capitolo precedente.

Pubblicitร 

In questa guida...