Come passare i dati tra le attività con Android Parcelable

introduzione

Spesso è necessario passare i dati tra le attività di un'app Android. Un modo semplice per farlo è con Intent.putExtra (), ma se hai molti dati strutturati da passare, Parcelable potrebbe essere una soluzione migliore. In questo post ti mostrerò come Parcelable semplifica la serializzazione delle classi per la condivisione tra attività.

Perché Parcelable?

Parcelable è un'interfaccia solo per Android. Permette agli sviluppatori di serializzare una classe in modo che le sue proprietà siano facilmente trasferite da un'attività all'altra. Questo viene fatto leggendo e scrivendo oggetti da Parcels, che possono contenere dati appiattiti all'interno dei contenitori di messaggi. 

Creazione dell'attività principale e del layout

La nostra attività principale gestirà la raccolta dei dettagli del libro. Iniziamo impostando il nostro onCreate metodo.

pacchetto com.tutsplus.code.android.bookparcel; import android.support.v7.app.AppCompatActivity; importare android.os.Bundle; public class MainActivity estende AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // ...

Avanti, aperto activity_main.xml per impostare il layout e l'aspetto della vista. Avrete bisogno di due campi di immissione del testo e un pulsante per l'invio.

Dovrebbe sembrare come questo:

    

Ora apri la tua attività principale e collega i campi di visualizzazione alla tua attività. Dovrai farlo dentro il tuo onCreate () metodo, come questo:

 // ... final EditText mBkTitle = (EditText) findViewById (R.id.title); final EditText mBkAuthor = (EditText) findViewById (R.id.author); Button button = (Button) findViewById (R.id.submit_button);

Per finire Attività principale, hai bisogno di creare un onClickListener. Questo sarà chiamato ogni volta che il Sottoscrivi pulsante viene premuto. Quando ciò accade, i dettagli inseriti devono essere raccolti e inviati alla prossima attività.

 button.setOnClickListener (new View.OnClickListener () @Override public void onClick (View v) Book book = new Book (mBkTitle.getText (). toString (), mBkAuthor.getText (). toString ()); Intento intento = nuovo Intent (MainActivity.this, BookActivity.class); intent.putExtra ("Book", book); startActivity (intent););

Qui, aggiungi un onClickListener al Pulsante istanza che hai recuperato dal tuo layout di attività. Questo codice verrà eseguito ogni volta che il Sottoscrivi il pulsante viene cliccato. 

Nota che semplicemente passiamo il Libro istanza a putExtra (). Come vedremo più tardi, Parcelable si occupa della serializzazione dei dati del libro in una stringa in modo che possa essere trasmessa tramite l'Intento.

Ora che l'attività principale è completa, dobbiamo creare il nostro BookActivity così come la classe Book per contenere le informazioni del libro.

Crea la classe del libro

Creiamo a Libro classe per contenere informazioni su ogni libro.

public class Book implementa Parcelable // book basics private String title; autore privato di stringhe; 

Questa classe deve essere implementata Parcelable. Ciò consentirà il passaggio dei dati da Attività principale a BookActivity.

Aggiungiamo anche alcune funzioni getter standard e un costruttore per creare rapidamente un'istanza della classe.

 // public constructor principale Book (String title, String author) this.title = title; this.author = autore;  // getters public String getTitle () return title;  public String getAuthor () return author; 

Scrivi al pacco

Il writeToParcel metodo è dove si aggiungono tutti i dati della classe al pacco. Questo è fatto in preparazione per il trasferimento. Questo metodo verrà passato a un'istanza Parcel che ha un numero di metodi di scrittura che è possibile utilizzare per aggiungere ciascun campo al pacchetto. Attenzione: l'ordine in cui scrivi i dati è importante!

Ecco come lo fai.

 // scrive i valori degli oggetti nella particella per lo spazio pubblico public writeToParcel (Parcel dest, int flags) dest.writeString (title); dest.writeString (autore); 

Leggi i dati indietro dal pacco

Proprio come il metodo di scrittura gestisce la scrittura dei dati da trasferire, il costruttore viene utilizzato per leggere i dati trasferiti dal pacchetto serializzato. Questo metodo verrà chiamato sull'attività ricevente per raccogliere i dati.

Ecco come dovrebbe apparire:

 public Book (Parcel parcel) title = parcel.readString (); author = parcel.readString (); 

L'attività di ricezione otterrà i dati sotto forma di stringa e chiamerà quindi getParcelableExtra metodo per avviare il processo di raccolta dei dati. Ciò attiverà il costruttore che abbiamo definito sopra, che deserializzerà i dati e ne creerà uno nuovo Libro esempio. 

Parcelable.Creator

Per completare la tua classe Parcelable, devi creare un Parcelable.Creator istanza e assegnarlo al CREATORE campo. L'API Parcelable cercherà questo campo quando è necessario deserializzare un'istanza della classe che è stata passata a un altro componente.

 pubblico statico finale Parcelable.Creator CREATORE = nuovo Parcelable.Creator() @ Override public Book createFromParcel (Parcel parcel) return new Book (pacco);  @Override public Book [] newArray (int size) return new Book [0]; ;

Questo lega tutto insieme. Il suo compito è semplice: genera istanze della tua classe Parcelable da a pacco utilizzando i dati del pacco forniti. Il creatore chiama il costruttore che hai definito sopra, passandolo a pacco oggetto e il costruttore inizializza gli attributi della classe.

Se la tua classe Parcelable avrà lezioni per bambini, dovrai fare un po 'di attenzione con il describeContents () metodo. Questo ti permetterà di identificare la specifica classe figlio che dovrebbe essere creata dal Parcelable.Creator. Puoi leggere ulteriori informazioni su come funziona su Stack Overflow.

Prenota attività e layout

Ora possiamo completare la nostra app con il libro Attività. Vai avanti e crea una nuova attività vuota chiamata BookActivity. Rendi il layout simile a quello che ho di seguito.

    

Nel activity_book.xml, ne hai solo bisogno due TextView widget, che verranno utilizzati per mostrare il titolo e l'autore dei libri.

Ora impostiamo la nostra attività. La tua attività dovrebbe già assomigliare a questa:

pacchetto com.tutsplus.code.android.bookparcel; import android.support.v7.app.AppCompatActivity; importare android.os.Bundle; public class BookActivity estende AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_book); 

In questa attività, desideri ricevere i dati che sono stati passati dalla tua attività principale e visualizzarli sulle tue visualizzazioni. In questo modo recupererai le istanze del tuo TextView usando l'id del TextView impostato nel layout.

 TextView mBkTitle = (TextView) findViewById (R.id.bk_title); TextView mBkAuthor = (TextView) findViewById (R.id.bk_author);

Quindi, naturalmente, chiamerai getIntent () perché recupererai i dati in questa attività. I dati che verranno recuperati sono raccolti dalla classe Book utilizzando getParcelableExtra (). Successivamente, imposti i valori di TextViews ai dati raccolti. Ecco come è fatto.

 Intento intent = getIntent (); Book book = intent.getParcelableExtra ("Libro"); mBkTitle.setText ("Title:" + book.getTitle ()); mBkAuthor.setText ("Autore:" + book.getAuthor ());

Crea la tua applicazione e lanciala, e dovresti vedere la piccola bellezza che hai appena costruito.

Conclusione

In questo post hai visto come puoi spostare facilmente gli oggetti da un'attività all'altra. Non è più necessario recuperare separatamente ciascun campo dati passato all'oggetto Intent e non è necessario ricordare il nome con cui è stato inoltrato ciascun campo. Non solo, ma questo processo è più veloce della funzionalità di serializzazione di Java.

In questo tutorial, hai imparato come usare Parcelable per passare i dati da un'attività all'altra. Puoi approfondire ulteriormente Parcelable controllando la documentazione ufficiale. 

Nel frattempo, dai uno sguardo ad alcuni dei nostri altri post sullo sviluppo di app per Android!