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à.
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.
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.
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;
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);
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.
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.CreatorCREATORE = 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.
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.
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!