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