DevCorner

DevCorner: implementiamo l’OnClickListener, usiamo il putExtra e salviamo dati nelle SharedPreferences

Giuseppe Tripodi -

Come avrete potuto intuire dal titolo, l’appuntamento di questa settimana con DevCorner è particolarmente ricco: tratteremo, oggi, di come implementare l’OnClickListener per gestire al meglio diversi bottoni in un’unica Activity e di come memorizzare dei dati per riutilizzarli. In particolare, utilizzeremo il putExtra per trasferire semplicemente una stringa da un’Activity ad un’altra e le SharedPreferences per salvare del testo che rimarrà nei dati della nostra App anche quando questa verrà chiusa.

Per prima cosa, creiamo una nuova applicazione di prova che, semanticamente, andremo a chiamare TestApp. Definiamo quindi il layout della Main_Activity, nella quale inseriremo una EditText dove scrivere e due bottoni: il primo per salvare quanto digitato nelle SharedPreferences e il secondo per cambiare Activity.

Il layout finale dovrebbe essere qualcosa di simile:



    

OnClickListener

Apriamo quindi il file java collegato alla Main_Activity ed andiamo ad implementare l’OnClickListener. Come ricorderete dai precedenti episodi, ci sono diversi metodi per aggiungere un “ascoltatore” su dei bottoni, facendo in modo che una volta cliccati facciano qualcosa, ma questo che andiamo a definire è probabilmente il più completo.

Nella nostra classe, dichiariamo subito i pulsanti ed il campo di testo senza specificare nulla e definiamoli successivamente nel metodo OnCreate, come fatto in passato, passandogli l’ID:

public class MainActivity extends Activity {

Button salva;

Button cambia;

EditText testoDaSalvare;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

salva = (Button) findViewById(R.id.salva);

cambia = (Button) findViewById(R.id.cambia);

testoDaSalvare = (EditText) findViewById(R.id.testo);

}

}

Fatto questo, implementiamo la classe OnClickListener. Per farlo, dopo averla importata (import android.view.View.OnClickListener) aggiungiamo implements OnClickListener subito dopo il “classico” public public class MainActivity extends Activity così:

public class MainActivity extends Activity implements OnClickListener {

a questo punto, noteremo che ci verrà dato un errore: questo accade perché, implementando questa classe, dobbiamo necessariamente riscrivere il metodo OnClick, che andiamo ad aggiungere, momentaneamente vuoto, in fondo alla classe:

@Override

public void onClick(View view) {

// TODO Auto-generated method stub

}

Fatto questo, possiamo aggiungere gli OnClickListener ai bottoni ma questa volta, invece che creare un nuovo OnClickListener come fatto nei precedenti episodi, passeremo un this tra parentesi, poiché è lo prorprio l’OnClickListener presente nella nostra Activity quello che i bottoni devono utilizzare.

salva.setOnClickListener(this);

cambia.setOnClickListener(this);

A questo punto, però dobbiamo differenziare quel che l’OnClick farà a seconda del tasto che viene premuto: modifichiamo, quindi, il metodo OnClick nel seguente modo:

@Override

public void onClick(View view) {

if (view == salva) {

//fai qualcosa

}

if (view == cambia) {

//fai qualcos’altro

}

}

Adesso, il nostro metodo sarà in grado di riconoscere la view che lo ha generato e potremo, successivamente, personalizzare le azioni da compiere a seconda del bottone premuto.

SharedPreferences

Adesso che ci siamo divertiti a piazzare bottoni e campi di testo, è il momento di utilizzarli: per sfruttarli al meglio, andiamo a spiegarvi una cosa veramente sfiziosa che vi sarà utile più di una volta: le SharedPreferences. Si tratta, come suggerisce il nome, di preferenze, impostazioni: un qualcosa che, una volta stabilito, deve essere conservato. Il contenuto di un dato salvato in questo modo, infatti, non viene cancellato neanche quando l’app viene chiusa: è quindi l’ideale per gestire eventuali Settings o mantenere uno username.

Per prima cosa, definiamo subito le nostre SharedPreferences all’inizio della classe, (le chiameremo prefs) e nell’OnCreate richiamiamo il PreferenceManager che andrà ad utilizzare il metodo getDefaultSharedPreferences(). Già che ci siamo, definiamo anche una stringa chiamata testo, che ci sarà utile successivamente.

SharedPreferences prefs;

String testo;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

salva = (Button) findViewById(R.id.salva);

salva.setOnClickListener(this);

cambia = (Button) findViewById(R.id.cambia);

cambia.setOnClickListener(this);

testoDaSalvare = (EditText) findViewById(R.id.testo);

prefs = PreferenceManager.getDefaultSharedPreferences(this);

Fatto questo, dobbiamo adesso fare in modo che cliccando sul tasto Salva il testo presente nell’EditText venga salvato nelle SharedPreferences.
Tornaimo quindi a modificare la prima parte del nostro vecchio e caro OnClick, in questo modo:

public void onClick(View view) {

if (view == salva) {

testo = testoDaSalvare.getText().toString();

salvapreferenze(testo);

Toast.makeText(getApplicationContext(), "Testo salvato!", Toast.LENGTH_LONG).show();

}

In questo modo abbiamo specificato che, al click del bottone, nella variabile testo che ci siamo precedentemente creati venga assegnato quanto preso dall’EditText chiamata testoDaSalvare: per farlo, abbiamo usato il metodo getText (che, appunto, ottiene il testo scritto ma lo restituisce in formato Editable) e toString (che lo converte in una stringa).

Questa variabile testo, adesso andremo a passarla ad un metodo salvapreferenze, che però non abbiamo ancora scritto: rimediamo subito e vediamo come salvare le SharedPreferences.

public void salvapreferenze(String testo) {

prefs = PreferenceManager.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = prefs.edit();

editor.putString("testoSalvato", testo);

editor.commit();

}

Come potete notare, per prima cosa ci richiamiamo nuovamente il Preference Manager e, successivamente, definiamo un editor, dal quale compiere le operazioni sulle SharedPreferenze. Richiamando il metodo putString() dell’editor andiamo ad aggiungere una stringa alle nostre preferenze: in particolare, andiamo ad associare ad una variabile globale il nostro testo. Nel nostro caso, ogni volta che vorremo riottenere il testo salvato, ci basterà richiamare la Stringa che abbiamo chiamato “testoSalvato”.
Facciamo infine un commit() per completare il tutto e salvare effettivamente le preferenze.

Prima di concludere, all’interno dell’OnClick andiamo a scrivere che il bottone Cambia servirà, appunto, a cambiare Activity: per farlo utilizzeremo i “soliti” intent.

Il risultato finale della nostra Activity, a questo punto, dovrebbe essere più o meno così:

package com.peppeuz.testapp;

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

import android.preference.PreferenceManager;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

Button salva;

Button cambia;

EditText testoDaSalvare;

SharedPreferences prefs;

String testo;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

salva = (Button) findViewById(R.id.salva);

salva.setOnClickListener(this);

cambia = (Button) findViewById(R.id.cambia);

cambia.setOnClickListener(this);

testoDaSalvare = (EditText) findViewById(R.id.testo);

prefs = PreferenceManager.getDefaultSharedPreferences(this);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

public void onClick(View view) {

if (view == salva) {

String testo = testoDaSalvare.getText().toString();

salvapreferenze(testo);

Toast.makeText(getApplicationContext(), "Testo salvato!", Toast.LENGTH_LONG).show();

}

if (view == cambia) {

Intent cambia = new Intent(this, Second_activity.class);

startActivity(cambia);

}

// TODO Auto-generated method stub

}

public void salvapreferenze(String testo) {

prefs = PreferenceManager.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = prefs.edit();

editor.putString("testoSalvato", testo);

editor.commit();

}

}

Fatto questo, creaiamo la nostra Second_Activity (se non altro per non far rimanere quel brutto erroraccio accanto l’intent!), dove andremo ad inserire un nuovo EditText e un altro bottone per tornare alla prima schermata. Il codice dell’XML, alla fine, dovrebbe essere così:



Passiamo adesso alla parte “seria” e andiamo a modificare il file java: come abbiamo fatto per la MainActivity, implementiamo l’OnClickListener e definiamo campo di testo e bottoni; aggiungiamo, inoltre, le SharedPreferences e una stringa chiamata testoRicevuto.

 


public class Second_activity extends Activity implements OnClickListener {
	EditText secondoTesto;
	Button torna;
	SharedPreferences prefs;
	String testoRicevuto;
}

Come potete notare, abbiamo nuovamente richiamato il PreferenceManager e abbiamo definito il testoRicevuto: per farlo, abbiamo utilizzato il metodo getString() sulle nostre prefs. Da notare che “testoSalvato” è il modo in cui avevamo battezzato il testo da prelevare, mentre quello che potete leggere dopo la virgola è il testo che verrà impostato di default qualora qualcosa andasse male.

Infine, non ci rimane che mettre il nostro testoRicevuto all’interno dell’EditText che abbiamo chiamato secondoTesto: per farlo, è sufficiente utilizzare il setText(), al quale passiamo la stringa in questione.

Quello che vogliamo fare adesso, però, è poter modificare questo testo e rispedirlo al mittente modificato. Per farlo, utilizzeremo il putExtra. Si tratta di un metodo molto semplice: tutto quello che ci consente di fare è associare un valore ad una variabile, che può essere trasferita tra le activity. La differenza con le SharedPreferences, come potete capire, è sostanziale, in quanto queste ultime ci consentono di salvare qualcosa “a lungo termine”.

Definiamo quindi il nostro OnClick, che stabilisce ciò che deve accadere quando l’utente clicca il bottone “Torna alla prima activity”:

@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if (view == torna){
String testoDaInviare = secondoTesto.getText().toString();
Intent cambia = new Intent(this, MainActivity.class);
cambia.putExtra("testoIndietro", testoDaInviare);
startActivity(cambia);
}
}

Come si può facilmente intuire, abbiamo fatto in modo che quando venga cliccato il bottone che abbiamo chiamato torna, all’interno di una variabile testoDaInviare abbiamo salvato quanto era scritto nell’EditText secondoTesto. Dopo aver definito un Intent che ci fa tornare alla prima activity, però, abbiamo utilizzato il putExtra: il funzionamento è molto simile a quello delle SharedPreferences: associamo il nostro testoDaInviare ad una chiave chiamata testoIndietro.

Come ultima cosa, non ci rimane che “ricevere” questo testo nella Main Activity (non pensavate che lo facesse automaticamente, vero?).

Torniamo quindi al primo file java e, per prima cosa, aggiungiamo un Bundle che chiamiamo extra: nell’OnCreate lo utilizziamo per ottenere l’Intent ricevuto e gli Extra ad esso associati, in questo modo:

extra = getIntent().getExtras();

Non ci rimane, quindi, che impostare nella prima EditText il testo ricevuto dalla seconda. Ma, per evitare che l’applicazione dia problemi appena avviata (quando, insomma, non ha ancora ricevuto nulla dalla SecondActivity), specifichiamo che, qualora non dovesse esistere nessun Extra andremo ad impostare quanto salvato nelle SharedPreferences o, al massimo, nulla (che è il valore di default dopo la virgola).

In definitiva, l’OnCreate della nostra prima Activity apparirà così:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
salva = (Button) findViewById(R.id.salva);
salva.setOnClickListener(this);
cambia = (Button) findViewById(R.id.cambia);
cambia.setOnClickListener(this);
testoDaSalvare = (EditText) findViewById(R.id.testo);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
extra = getIntent().getExtras();
if (extra != null) {
testo = extra.getString("testoIndietro");
} else
{
testo = prefs.getString("testoSalvato", "");
}
Toast.makeText(getApplicationContext(), testo, Toast.LENGTH_LONG).show();
testoDaSalvare.setText(testo);
}

Anche per questa settimana, il (corposo!) appuntamento è terminato: considerando che gli argomenti affrontati sono sempre di più, vi rimandiamo come sempre al nostro forum, dove saremo felici di darvi tutto il supporto possibile e dove troverete il codice sorgente completo e gli apk.
Buona programmazione a tutti!