Gegevens doorgeven tussen activiteiten met Android Parcelable

Invoering

We moeten vaak gegevens doorgeven tussen de activiteiten van een Android-app. Een gemakkelijke manier om dit te doen is met Intent.putExtra (), maar als je veel gestructureerde gegevens moet doorgeven, is Parcelable een betere oplossing. In dit bericht laat ik je zien hoe Parcelable het gemakkelijk maakt om klassen te serialiseren voor het delen van activiteiten.

Waarom Pakket?

Parable is een Android-only interface. Hiermee kunnen ontwikkelaars een klasse serialiseren, zodat de eigenschappen ervan gemakkelijk van de ene activiteit naar de andere worden overgedragen. Dit gebeurt door het lezen en schrijven van objecten uit pakketten, die afgevlakte gegevens in berichtencontainers kunnen bevatten. 

De hoofdactiviteit en opmaak maken

Onze hoofdactiviteit behandelt de verzameling van de boekgegevens. Laten we beginnen met het opzetten van onze onCreate methode.

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

Open vervolgens activity_main.xml om de lay-out en het uiterlijk van de weergave in te stellen. U hebt twee tekstinvoervelden en een knop voor inzending nodig.

Het zou er zo uit moeten zien:

    

Open nu uw hoofdactiviteit en koppel de weergavevelden aan uw activiteit. Je moet het in je doen onCreate () methode, zoals deze:

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

Om het af te maken Hoofdactiviteit, je moet een onClickListener. Dit wordt altijd weergegeven als het voorleggen knop is ingedrukt. Wanneer dat gebeurt, moeten de ingevoerde gegevens worden verzameld en naar de volgende activiteit worden verzonden.

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

Hier voeg je een toe onClickListener naar de Knop bijvoorbeeld die u hebt opgehaald uit uw Activiteitslay-out. Deze code zal worden uitgevoerd wanneer de voorleggen knop is geklikt. 

Merk op dat we gewoon de Boek bijvoorbeeld naar putExtra (). Zoals we later zullen zien, zorgt Parcelable voor het serialiseren van de boekgegevens in een string zodat deze via de intentie kan worden doorgegeven.

Nu de hoofdactiviteit is voltooid, moeten we onze BookActivity evenals de klasse Book om boekinfo bij te houden.

Maak de boekenklasse

Laten we een maken Boek klas om informatie over elk boek te bewaren.

public class Boek-implementaties Parcelable // book basics private String title; private String auteur; 

Deze klasse moet worden geïmplementeerd Parcelable. Hiermee wordt het doorgeven van de gegevens mogelijk Hoofdactiviteit naar BookActivity.

We voegen ook enkele standaard getterfuncties en een constructor toe om snel een exemplaar van de klasse te maken.

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

Schrijf naar het pakket

De writeToParcel methode is waar u al uw klassegegevens aan het pakket toevoegt. Dit wordt gedaan ter voorbereiding op overdracht. Deze methode wordt doorgegeven aan een Parcel-instantie met een aantal schrijfmethoden die u kunt gebruiken om elk veld aan het pakket toe te voegen. Let op: de volgorde waarin u de gegevens schrijft, is belangrijk!

Hier is hoe je het doet.

 // schrijf objectwaarden naar pakket voor opslag public void writeToParcel (Parcel dest, int flags) dest.writeString (title); dest.writeString (auteur); 

Lees gegevens terug van het pakket

Net zoals de schrijfmethode omgaat met het schrijven van de gegevens die moeten worden overgedragen, wordt de constructor gebruikt om de overgedragen gegevens terug te lezen van het geserialiseerde pakket. Deze methode wordt bij de ontvangende activiteit aangeroepen om de gegevens te verzamelen.

Hier is hoe het eruit zou moeten zien:

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

De ontvangende activiteit krijgt de gegevens als een tekenreeks en roept vervolgens de getParcelableExtra methode om het verzamelen van de gegevens te starten. Dat zal de constructor triggeren die we hierboven hebben gedefinieerd, die de gegevens deserialiseren en een nieuwe maken Boek aanleg. 

Parcelable.Creator

Om uw pakketles te voltooien, moet u een Parcelable.Creator bijvoorbeeld en wijs het toe aan de SCHEPPER veld. De pakket API zal dit veld zoeken wanneer het een instantie van uw klasse moet deserialiseren die is doorgegeven aan een andere component.

 openbare statische finale Parcelable.Creator CREATOR = nieuwe Parcelable.Creator() @Override public Book createFromParcel (Parcel parcel) retourneer nieuw boek (pakket);  @Override public Book [] newArray (int size) ga terug naar nieuw boek [0]; ;

Dit bindt alles samen. Het werk is eenvoudig: het genereert exemplaren van uw pakkettaak uit een Pakket gebruik van de verstrekte pakketgegevens. De maker roept de constructor aan die u hierboven hebt gedefinieerd en geeft deze door Pakket object en de constructor initialiseert de klassekenmerken.

Als uw klasse Parcelable kinderlessen heeft, moet u extra voorzichtig zijn met de describeContents () methode. Hiermee kunt u de specifieke onderliggende klasse identificeren die moet worden gemaakt door de Parcelable.Creator. U kunt meer lezen over hoe dit werkt op Stack Overflow.

Activiteit en opmaak boeken

Nu kunnen we onze app voltooien met het boek Activiteit. Ga je gang en maak een nieuwe lege activiteit genaamd BookActivity. Laat de lay-out eruitzien als wat ik hieronder heb.

    

In de activity_book.xml, je hebt er maar twee nodig Tekstweergave widgets, die zullen worden gebruikt om de titel en auteur van de boeken te tonen.

Laten we nu onze activiteit instellen. Je activiteit zou er al zo uit moeten zien:

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

In deze activiteit wilt u de gegevens ontvangen die zijn doorgegeven via uw hoofdactiviteit en deze weergeven in uw weergaven. Zo haalt u de instanties van uw terug Tekstweergave gebruik de id van de Tekstweergave zet in je lay-out.

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

Dan bel je natuurlijk getIntent () omdat u gegevens in deze activiteit ophaalt. De gegevens die u ophaalt, worden verzameld in de klasse Book met getParcelableExtra (). Vervolgens stelt u de waarden in van de TextViews naar de gegevens die u hebt verzameld. Hier is hoe het is gedaan.

 Intent opzet = getIntent (); Boek boek = intent.getParcelableExtra ("Boek"); mBkTitle.setText ("Title:" + book.getTitle ()); mBkAuthor.setText ("Author:" + book.getAuthor ());

Bouw je applicatie en start deze, en je zou de kleine schoonheid moeten zien die je zojuist hebt gebouwd.

Conclusie

In dit bericht heb je gezien hoe je objecten eenvoudig van de ene activiteit naar de andere kunt verplaatsen. U hoeft niet langer elk gegevensveld dat u hebt doorgegeven aan het Intent-object afzonderlijk op te halen en u hoeft niet de naam te onthouden die u onder elk veld hebt gepasseerd. Niet alleen dat, maar dit proces is sneller dan de serialize-functionaliteit van Java.

In deze zelfstudie hebt u geleerd hoe u Parcelable kunt gebruiken om gegevens van de ene activiteit naar de andere over te dragen. Je kunt dieper in Parcelable duiken door de officiële documentatie te controleren. 

Bekijk in de tussentijd een aantal van onze andere berichten over de ontwikkeling van Android-apps!