Livello di difficoltà: facileVersione SDK utilizzata: >1.1Link al file compresso del progetto eclipse: file in allegatoIl passaggio di dati tra un'activity ed un'altra, è senza dubbio una componente fondamentale nello sviluppo software su android.
Caso pratico:
Ammettiamo che l'utente arrivi in una schermata (prima activity) dove deve scegliere un ipotetico livello da 1 a 10.
Quando l'utente clicca "avanti" arriverà in una schermata (seconda activity) il quale contenuto sarà diverso a seconda del livello scelto.
possiamo gestire la cosa creando 10 activity diverse e a dipendenza del livello scelto lanciare quella opprtuna, oppure possiamo gestire la seconda schermata con un' activity unica che in base ad un valore ricevuto (il nostro ipotetico livello), modella il suo contenuto.
Per una serie di motivi che sicuramente capirete, la seconda opzione è la migliore.
Stacchiamoci un attimo da questo caso pratico e vediamo come si implementa un semplice passaggio di dati tra due activity:
public class Activity1 extends Activity {
Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act1);
//dati da passare
int i=5;
String s="ciao";
Person p=new Person("Erich", "Gamma");
//per passare un tipo di dato personalizzato (Person)
//esso deve implementare l'interfaccia Serializable
//la seconda activity da lanciare
intent=new Intent(getApplicationContext(), Activity2.class);
String pkg=getPackageName();
//per rendere univoci i nomi delle chiavi passate
//è consigliato (la doc dice 'must') aggiungere il nome del nostro package davanti al nome
intent.putExtra(pkg+".myString", s); //inseriamo i dati nell'intent
intent.putExtra(pkg+".myInt", i);
intent.putExtra(pkg+".myPerson", p);
Button button=(Button)findViewById(R.id.startAct2);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent); //facciamo partire la seconda activity
}
});
}
}public class Activity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act2);
Intent intent=getIntent(); // l'intent di questa activity
String pkg=getPackageName();
String s=intent.getStringExtra(pkg+".myString"); //prendiamo i dati
int i=intent.getIntExtra(pkg+".myInt", -1);
Person p=(Person)intent.getSerializableExtra(pkg+".myPerson");
TextView tv=(TextView)findViewById(R.id.result);
tv.append("myString:"+s+"\n"); //visualizziamo i dati
tv.append("myInt:"+i+"\n");
tv.append("myPerson:"+p+"\n");
}
}Come vediamo all'interno di ogni intent, è stata gentilmente messa a disposizione una sorta di Map, dove noi possiamo inserire i nostri valori indentificandoli con delle stringe (chiavi).
Per tutti i tipi di dato primari (String,int,long,float,boolean,ecc....)
esiste un metodo per inserire
un dato o un array di dati all interno di questa Map. Esiste ovviamente il metodo corrispondente per ritrovare questi dati.
Se vogliamo inserire un tipo di dato personale (nell'esempio Person) dobbiamo implementare Serializable nella classe in questione:
public class Person implements Serializable{
String name;
String surname;
public Person(String name,String surname) {
this.name=name;
this.surname=surname;
}
@Override
public String toString() { //implementazione di toString facoltativa
return "Persona: "+name+" "+surname;
}
}Nota: ogni activity diversa va dichiarata anche nel manifest.
Per conoscenza:Se volessimo raggruppare dei dati da passare, il framework mette a disposizione una classe Bundle ,che non è altro che una la Map presente negli intent, sulla quale possiamo chiamare tutti i metodi putExtra e get..Extra
Una volta creato un bundle, esso puo essere inserito in un intent tramite un putExtra("nomeBundle",bundle) oppure con putExtras(bundle), e reperito poi con getBundleExtra(nomeBundle) rispettivamente getExtras()
Se tutto ciò non vi bastasse, potete implementarvi il vostro bel MVC come spiegato
quiSpero che questo tutorial vi possa essere utile

Un Saluto.
Qlimax