DevCorner

DevCorner: usiamo le Risorse e l’OnClickListener

Giuseppe Tripodi -

Come ogni settimana, torniamo a parlare di programmazione Android: la lezione odierna verterà sulle Risorse (cosa sono e come si utilizzano) e l’OnClickListener che, come suggerisce il nome, è il metodo che si occupa di far accadere qualcosa quando “sente” che un bottone o quant’altro è stato premuto.

Per spiegare il tutto, continueremo con lo sviluppo di Hello (Android)World!, l’applicazione esempio creata due settimane fa per spiegare Activity ed Intent: vi consigliamo, quindi, di andare a dare un’occhiata qualora abbiate saltato il precedente appuntamento.

Risorse

Probabilmente ricorderete che la volta scorsa abbiamo inserito qualcosa come

   
android:text: “Cambia Activity”

Eclipse, in questo caso, potrebbe (dipende dalla versione dell’SDK) avvisarci con un warning, spiegando che è sbagliato inserire dell’hard text e che la procedura consigliata prevede l’utilizzo delle risorse. Ma cosa sono queste risorse?

Programmando in Android, ogni volta che si deve inserire un testo, un colore, un array (e tanto altro…) è buona norma non inserire il valore direttamente ma creare una risorsa (all’interno della cartella /res),  per poi collegarla al campo specifico tramite un nome.
Per capire praticamente come fare, andiamo a definire come una risorsa String il “Cambia Activity” scritto nella precedente guida.

Entriamo quindi all’interno della cartella values (contenuta in /res) e apriamo strings.xml: clicchiamo il tasto Add, scegliamo String e, sulla destra, scriviamo “change come Name e “Cambia Activity” come value.

Aggiunta Stringa

Nota bene: non inserite mai lettere maiuscole, spazi o altri caratteri speciali nel campo Name poiché questo potrebbe corrompere il file R.java (del quale parleremo più avanti), fondamentale per l’autocompilazione del software.

Salviamo il tutto con un bel Ctrl+S e torniamo sul file activity_main.xml contenuto in /res/layout: qui, all’interno del bottone dove avevmo scritto Cambia Activity, sostituiamolo con

   
android:text: "@string/change"

in questo modo, invece di scrivere esplicitamente il testo che vogliamo, chiediamo al sistema di richiamare la stringa che ha nome “change” che abbiamo precedentemente definito. Sebbene questo procedimento possa sembrare superfluo, diventa davvero utile per mantenere l’ordine del codice in caso di testi lunghi e, soprattutto, è fondamentale per la localizzazione del software: nella prossima guida, spiegheremo infatti come tradurre al meglio la propria app con i qualifiers.

Una volta capita la procedura, procedete a fare la stessa cosa per il testo “Hello (Android)World!”, creando una stringa di nome aw che richiameremo all’interno di second_activity.xml così:

   
 android:text="@string/aw"

OnClickListener

Passiamo adesso al secondo argomento della lezione, l’OnClickListener: come potrete intuire dal nome, grazie a questo Ascoltatore è possibile eseguire delle azioni quando un tasto (o qualsiasi altra cosa) viene cliccata: la volta scorsa, per cambiare Activity, avevamo utilizzato la proprietà onClick definita dal layout: sebbene questo metodo non dovrebbe creare problemi, è tuttavia consigliato utilizzare un OnClickListener definito direttamente nel codice java.

Vediamo quindi come fare a far comparire un toast (ossia un breve messaggio in sovraimpressione) al click di un tasto. Andiamo in second_activity.xml e definiamo un button che abbia come id buttonToast: per il testo definiamo una risorsa Stringa maketoast alla quale corrisponde il testo “Cliccami!” come spiegato precedentemente. Il risultato finale dovrebbe essere qualcosa di simile:

   



Apriamo adesso il file SecondActivity.java contenuto all’interno di /src/nomedelpacchetto e, per prima cosa, definiamo il nostro bottone appena creato, in modo che sia identificato all’interno del codice. Subito dopo l’apertura delle parentesi graffe che indicano l’inizio dell’activity, scriviamo:

Button createToast;

Come sempre, qualora riceviate un errore provvedete ad importare le librerie mancanti con Ctrl+Shift+O. Adesso abbiamo un bottone che si chiama createToast, ma che non è effettivamente associato a nessun elemento dell’interfaccia grafica. Per “collegarlo” al nostro tasto Cliccami, scriviamo quanto segue all’interno del metodo onCreate:

createToast = (Button) findViewById(R.id.buttonToast);

Così facendo, stiamo specificando che l’oggetto createToast è un bottone che corrisponde alla View (findViewById) che ha come id buttonToast.
Se vi state domandando il perché di quell’R.id, oltre a consigliarvi una lettura più approfondita delle guide di Google, spendiamo due parole sulla classe R: si tratta di un file autocompilato che non deve essere mai modificato: si occupa di associare gli elementi dell’interfaccia a delle allocazioni di memoria. In questo caso, ad esempio, R.id.buttonToast non corrisponde a del testo come ci si aspetterebbe ma ad un numero intero, che non è nient’altro che l’allocazione di memoria utilizzata dall’oggetto che ha come id buttonToast.

Detto questo, andiamo finalmente a definire che, cliccando il bottone, questo deve far comparire un toast con scritto “Questo è solo un toast di prova!”: andiamo quindi a definire una risorsa String che abbia come valore questo testo e come nome toast, come spiegato precedentemente.

Torniamo quindi nel Second_activity.java e, sempre nell’OnCreate, dopo quanto scritto per definire il bottone, aggiungiamo:

createToast.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
			  	Toast toastExample;
				toastExample = Toast.makeText(getApplicationContext(),  getResources().getString(R.string.toast), Toast.LENGTH_LONG);
				toastExample.show();

			}
		});

Nel primo rigo abbiamo specificato che l’elemento createToast ha associato un nuovo OnClickListener: all’interno di onClick, definiamo invece cosa deve succedere tappando sul bottone.
Viene quindi creato un elemento toast chiamato toastExample, che andiamo a definire al rigo successivo:

  • getApplicationContext() è un metodo per ottenere automaticamente il Context, ossia una variabile che specifica in quale activity ci troviamo,
  • getResources().getString(R.string.toast) va a cercare tra le Risorse la Stringa che ha associato come nome toast all’interno del file R
  • Toast.LENGTH_LONG, infine, specifica quanto tempo deve stare in sovraimpressione il toast.

Il risultato finale di tutto il codice, infine, dovrebbe essere qualcosa di simile:

package com.example.helloandroidworld;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class SecondActivity extends Activity {
	Button createToast;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		createToast = (Button) findViewById(R.id.buttonToast);
		createToast.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Toast toastExample;
				toastExample = Toast.makeText(getApplicationContext(),  getResources().getString(R.string.toast), Toast.LENGTH_LONG);
				toastExample.show();

			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.second, menu);
		return true;
	}

}

Se avete eseguito tutto correttamente, avete importato le librerie correttamente (con Ctrl+Shift+O) e non avete nessun errore, deployando l’applicazione sul vostro smartphone dovreste riuscire, una volta cambiata activity, a far comparire un toast come quello dell’immagine qui in basso:

Toast di prova

Come sempre, ricordiamo che ci possono essere i più svariati problemi nella programmazione, quindi qualora abbiate qualsiasi tipo di problema vi rimandiamo sul nostro forum, dove saremo felici di assistervi ed aiutarvi. Sperando di essere stati sufficientemente esaustivi, con un toast vi rimandiamo al prossimo appuntamento!

Toast saluto