Autore Topic: [facile] Passaggio di dati tra un'activity ed un'altra  (Letto 52956 volte)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
[facile] Passaggio di dati tra un'activity ed un'altra
« il: 18 Marzo 2010, 22:39:10 CET »
+8
Livello di difficoltà: facile
Versione SDK utilizzata: >1.1
Link al file compresso del progetto eclipse: file in allegato

Il 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:

Codice (Java): [Seleziona]
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
                               
                        }
                });
    }
}

Codice (Java): [Seleziona]
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:

Codice (Java): [Seleziona]
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 qui


Spero che questo tutorial vi possa essere utile :)

Un Saluto.
Qlimax
« Ultima modifica: 31 Gennaio 2011, 19:23:50 CET da Qlimax »

Offline daniele

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #1 il: 26 Marzo 2010, 14:46:16 CET »
+1
Grazieeeeeeeeee.

Offline onire

  • Utente junior
  • **
  • Post: 52
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Dream G1, Samsung Galaxy S
  • Sistema operativo:
    Windows Xp
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #2 il: 19 Aprile 2010, 12:40:46 CEST »
0
Ciao Qlimax, due cose non mi sono chiare:
- l'intente è univoco? Ovvero se io avessi 3 activity i cui i dati  della prima activity mi occorrono nella seconda e quelli di quest'ultima nella terza, come faccio a selezionarli solo quelli che mi occorrono?
- perchè intent.putExtra(pkg+".myString", s);  e non intent.putExtra(pkg.myString, s);

Scusami, saranno domande stupide, ma sono veramente agli inizi.
Grazie

Offline MicKey

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
    • Mik's
  • Dispositivo Android:
    HTC Hero
  • Play Store ID:
    Michele Agostini
  • Sistema operativo:
    Ubuntu Linux
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #3 il: 27 Aprile 2010, 12:27:18 CEST »
0
- perchè intent.putExtra(pkg+".myString", s);  e non intent.putExtra(pkg.myString, s);
Sono due cose diverse: la prima, quella dell'esempio, invoca putExtra con una stringa formata dal contenuto della variabile pkg + .myString (se pkg contenesse "Bach", la stringa inviata sarebbe "Bach.myString"). L'altra, pkg.myString, invierebbe la stringa contenuta nell'attributo myString dell'oggetto pkg :D

Per la prima domanda non so, ancora non ho cincischiato molto con gli intent.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #4 il: 03 Maggio 2010, 17:52:36 CEST »
0
- l'intente è univoco? Ovvero se io avessi 3 activity i cui i dati  della prima activity mi occorrono nella seconda e quelli di quest'ultima nella terza, come faccio a selezionarli solo quelli che mi occorrono?

ciao onire,
non ho capito bene la tua domanda...
potresti spiegare meglio cosa vorresti fare? magari con un esempio ...

Saluti.
Qlimax

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #5 il: 03 Agosto 2010, 16:48:29 CEST »
0
Qlimax, grazie per questo tutorial

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #6 il: 10 Settembre 2010, 16:34:22 CEST »
0
Ciao Qlimax, mi sapresti dire come fare per poter passare una lista o un array di oggeti?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #7 il: 10 Settembre 2010, 19:01:48 CEST »
0
Ciao Qlimax, mi sapresti dire come fare per poter passare una lista o un array di oggeti?

Se devi passare una List o un ArrayList devi usare il metodo putSerializable.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #8 il: 10 Settembre 2010, 19:29:34 CEST »
0
Se devi passare una List o un ArrayList devi usare il metodo putSerializable.
inoltre gli oggetti contenuti nella lista devono anch'essi implemetare Serializable (o Parcelable).

se non usi un Bundle specifico (come nel tutorial) ti basta
Codice (Java): [Seleziona]
 intent.putExtra("arrayListPersone", tuoArrayList);nella activity B poi, riprendi la lista facendo un casting sul tuo tipo di lista, ad esempio:

Codice (Java): [Seleziona]
ArrayList<Person> personsList=(ArrayList<Person>)intent.getSerializableExtra("arrayListPersone");



« Ultima modifica: 10 Settembre 2010, 19:31:40 CEST da Qlimax »

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #9 il: 10 Settembre 2010, 19:34:13 CEST »
0
grazie mille ad entrambi  ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #10 il: 10 Settembre 2010, 19:44:46 CEST »
+1
Alternativamente si può creare una classe che estende ArrayList e implementa Parcelable e scrivere a manina il codice:
Codice (Java): [Seleziona]
package it.addev.test

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class PersonList extends ArrayList<Person> implements Parcelable{

        private static final long serialVersionUID = 663585476779879096L;

        public PersonList(){
               
        }
       
        public PersonList(Parcel in){
                readFromParcel(in);
        }
       
        @SuppressWarnings("unchecked")
        public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
                public PersonList createFromParcel(Parcel in) {
                        return new PersonList(in);
                }

                public Object[] newArray(int arg0) {
                        return null;
                }

        };
       
        private void readFromParcel(Parcel in) {
                this.clear();
               
                //leggiamo la dimensione che è il primo elemento ad essere stato scritto
                int size = in.readInt();
               
                //leggiamo nome e cognome, creiamo gli oggetti e li mettiamo nella lista
                for (int i = 0; i < size; i++) {
                    String name = in.readString();
                        String surname = in.readString();
                        Person p = new Person(name, surname);
                        this.add(p);
                }
               
        }

        public int describeContents() {
                return 0;
        }

        public void writeToParcel(Parcel dest, int flags) {
                int size = this.size();
               
                //Prima scriviamo la dimensione della lista
                dest.writeInt(size);
               
                //Poi scriviamo sequenzialmente le stringhe, l'ordine è importante perchè poi la lettura andrà fatta nello stesso
                for (int i = 0; i < size; i++) {
                        Person = this.get(i);
                        dest.writeString(p.getName());
                        dest.writeString(p.getSurname());
                }
        }
}

Poi nell'intent si usa il metodo putParcelable.

Questo tipo di approccio è nettamente più performante perchè, a differenza di Serializable, non fa uso di reflection

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #11 il: 22 Ottobre 2010, 16:18:39 CEST »
0
Io vorrei utilizzare le info di  un ArrayList creato in una classe in un altra classe.

Ho dei metodi per estrarre informazioni dall ArrayList;
quindi creo il mio arraylist e lo popolo nella classe 1.java
Poi ho la classe 2.java e se provo a prendere le informazioni dal vettore(creato in 1.java) con i metodi suddetti, non riesco a utilizzarli.

Come posso fare?

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #12 il: 27 Ottobre 2010, 01:40:29 CEST »
0
Cmq complimenti e grazie ;-)

Offline CarloM

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #13 il: 04 Novembre 2010, 18:32:48 CET »
0
sbaglio o andrebbe aggiunto anche che bisogna aggiornare il Manifest con l'Activity aggiunta?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Passaggio di dati tra un'activity ed un'altra
« Risposta #14 il: 04 Novembre 2010, 20:21:45 CET »
0
sbaglio o andrebbe aggiunto anche che bisogna aggiornare il Manifest con l'Activity aggiunta?

Non l'ho scritto nel tutorial, mi sembrava sottointeso. Aggiungo questo appunto al tutorial.
Nel progetto allegato, comunque, il manifest contiene (per forza) entrambe le activity.