Android Lezione 4 – I bottoni

Nella lezione abbiamo visto come far scrivere del testo alla nostra applicazione, ora introduciam un altro degli oggetti base delle interfacce grafiche per android: I bottoni.

In questa lezione spieghermo come inserirli nel progetto, e come gestire gli eventi di pressione del bottone. Modificheremo l’applicazione di esempio aggiungendo 2 pulsanti che modificheranno il testo visualizzato nella TextView creata nell’articolo precedente.

Come per le textView anche i bottoni si definiscono all’interno dei file xml del layout (ovviamente ogni activity avrà il suo file di layout). Ricordo che i file xml che gestiscono il layou si trovono all’interno della cartella res/layout. Nel nostro esempio il file che andremo a modificare è main.xml.

Abbiamo due possibilità per inserire il bottone, tramite il gui designer, e direttamente all’interno dell’xml (in pratica è la stessa cosa, visto che il gui designer scrive all’interno del file xml). La prima modalità la potete vedere nella screenshot poco sopra, aprite sezione Form Widget e trascinate un button all’interno dell’area dell’applicazione.

Mentre se vogliamo definirlo a livello di codice xml dobbiamo inserire una stringa simile alla seguente:

<Button android:text="Button"
               android:id="@+id/button1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content">
</Button>

Dove:

  • android:text indica il nome che verrà visualizzato nel pulsante
  • android:id indica l’id del pulsante che verrà utilizzato per accedervi a livello di codice
  • android:layout_width indica la larghezza dell’oggetto
  • android:layout_height indica l’altezza dell’oggetto

Chiariamo il significato di wrap_content, che non sembra essere una definizione di dimensione, infatti serve ad indicare che l’oggetto sarà grande abbastanza per il suo contenuto.

Salviamo e andiamo a controllare la classe R.java (ricordo che si trova nella cartella  gen/.  Vediamone ora il contenuto:

package italialinux.example;
 
public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class id {
        public static final int button1=0x7f050000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

Come possiamo vedere è stato automaticamente aggiunto una variabile  button1 all’interno della subclass id (Ricordate che avevamo definito l’id del bottone con @id/button1?).

Bene una volta definito il pulsante non ci resta altro che gestirne la pressione. Per fare questo si deve:

  • Creare una classe che implementa OnClickListener e fare l’override del metodo onClick().
  • Associare questa classe al bottone

Ora vedremo due possibili modalità per gestire il click su di un pulsante. Il primo consiste nel fare l’override del metodo onClick direttamente all’interno della funzione per settare il Listener, il secondo esempio invece mostra come farlo utilizzando una classe ad-hoc.

Prima di tutto diamo un occhiata agli import necessari:

import android.widget.Button;
import android.view.View.OnClickListener;

Ora ovviamente ci serve l’accesso al bottone, questo lo facciamo mediante la findViewById, definiamo quindi una variabile di tipo Button all’interno della nostra Activity (nell’esempio l’ho definita una variabile interna del metodo onCreate):

Button firstButton = (Button) findViewById(R.id.button1);

Ora prima di procedere con la spiegazione dei due metodi, vi invito a vedere i metodi disponibili per la classe Button, noterete la presenza dei metodi setText(CharSequence …) e getText(),  che ci permettono di modificare/ottenere runtime il testo visualizzato all’interno del bottone. Quindi cambiamo il testo  al nostro pulsante con “Greetings”:

firstButton.setText("Greetings");

L’associazione del listener con il bottone avviene mediante il metodo setOnClickListener della classe button che prende come argomento un oggetto di tipo View.OnClickListener. Passiamo ora a vedere  il primo dei due metodi che per gestire il click su di un pulsante. Il codice base in questo caso è molto semplice:

         firstButton.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 //Stampa un messaggio
             }
         });

In pratica stiamo facendo l’override del metodo onClick direttamente all’interno della nostra activity. Quindi per esempio potremo approfittarne per modificare il testo della textView che avevamo dichiarato nella lezione precedente.

Per farlo dobbiamo prima fare una piccola modifica, ovvero dobbiamo portare la dichiarazione della variabile localText al di fuori del metodo onCreate, ovvero renderla una variabile di classe.
Inseriamo quindi nel pezzo di codice precedente, all’interno di onClick la seguente riga:

localText.setText("Hello again from Italialinux");

Così facendo abbiamo completato la gestione della pressione del pulsante. Questo metodo è utile secondo me nel caso in cui dobbiamo far fare operazioni elementari al nostro bottone, che coinvolgono un numero ristreetto di oggetti. Personalmente ritengo anche che contribuisca a rendere il codice meno leggibile (ma questa è una mia opinione).

Passiamo ora al secondo caso. Per fare questo aggiungiamo un secondo bottone chiamato button2, e carichiamolo all’interno della nostra activity (questa volta non ve lo spiego, ve lo lascio come esercizio), e creiamo una classe per gestire l’evento onClick chiamata ButtonAction. Create quindi un nuovo file java chiamato ButtonAction.java, lo scheletro della nostra classe sarà il seguente:

package italialinux.example;
import android.view.View;
import android.view.View.OnClickListener;
 
public class ButtonAction implements OnClickListener {
 
	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
 
	}
 
}

Notate che questo codice è autogenerato da Eclipse. Come possiamo vedere la nostra classe implementa l’interfaccia OnClickListener, che è quella che appunto contiene il metodo onClick che andremo a popolare.  Ora quello che vogliamo fare è modificare nuovamente la TextView con il messaggio: “Hello from a ButtonAction!!”.

Per farlo questa volta non possiamo usare direttamente localText, in quanto ci troviamo all’interno di un  classe differente. Quindi la soluzione migliore é passare alla classe gli oggetti che ci servono (dipende dalla nostre esigenze) quindi, dal momento che dobbiamo modificare i valori della variabile localText, che é una TextView, creiamo un costruttore che prende un argomento di tipo TextView appunto, che verrá salvato all’interno di una variabile di classe.  Ora possiamo fare l’override del metodo onClick. Il risultato finale sará  simile al seguente:

package italialinux.example;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
 
public class ButtonAction implements OnClickListener {
 
	TextView btnLocalText;
 
	public ButtonAction(TextView tv) {
		super();
		btnLocalText = tv;
	}
 
	@Override
	public void onClick(View arg0) {
		btnLocalText.setText("Hello from a ButtonAction!!");
	}
 
}

Mentre nell’Activity, dovremo prendere il riferimento al pulsante,  come fatto per il button1 e assegnarli il Listener appena creato. Il che diventa:

        Button secondButton = (Button)findViewById(R.id.button2);
    	secondButton.setOnClickListener(new ButtonAction(localText));

Una piccola precisazione:

Nell’implementare la vostra classe, prima di eseguire qualsiasi operazione con bottoni, label, etc dovete chiamare la setContentView con almeno un layout. Altrimenti l’applicazione non riuscirá a partire.

Infine uno screenshot di come appare la versione aggiornata dell’applicazione:

I sorgenti aggiornati della lezione li potete trovare qua

La prossima laezione vedremo i primi esempi di menu.

One thought on “Android Lezione 4 – I bottoni”

Leave a Reply to Riccardo Guglielmo Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.