Vi må ofte sende data mellom aktiviteter i en Android-app. En enkel måte å gjøre dette på er med Intent.putExtra ()
, men hvis du har mye strukturert data for å passere, kan Parcelable være en bedre løsning. I dette innlegget vil jeg vise deg hvordan Parcelable gjør det enkelt å serialisere klasser for deling mellom aktiviteter.
Pakket er et Android-only-grensesnitt. Det lar utviklere serialisere en klasse, slik at egenskapene enkelt overføres fra en aktivitet til en annen. Dette gjøres ved å lese og skrive objekter fra pakker, som kan inneholde flatete data i meldingsbeholdere.
Vår hovedaktivitet håndterer samlingen av bokdetaljer. La oss starte med å sette opp vår onCreate
metode.
pakke com.tutsplus.code.android.bookparcel; importer android.support.v7.app.AppCompatActivity; importere android.os.Bundle; offentlig klasse MainActivity utvider AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // ...
Deretter åpne activity_main.xml for å konfigurere visningsoppsettet og utseendet. Du må ha to tekstoppføringsfelter og en knapp for innsending.
Det skal se slik ut:
Nå åpner du hovedaktiviteten din og kobler visningsfeltene til aktiviteten din. Du må gjøre det inni din onCreate ()
metode, slik:
// ... endelig EditText mBkTitle = (EditText) findViewById (R.id.title); Endelig EditText mBkAuthor = (EditText) findViewById (R.id.author); Knappknapp = (Knapp) findViewById (R.id.submit_button);
For å fullføre Hoved aktivitet
, du må sette opp en onClickListener
. Dette vil bli kalt når Sende inn knappen er trykket. Når det skjer, skal innhentede opplysninger samles inn og sendes til neste aktivitet.
button.setOnClickListener (new View.OnClickListener () @Override public void onClick (Vis v) Bokbok = ny bok (mBkTitle.getText (). toString (), mBkAuthor.getText (). toString ()); = Ny Intent (MainActivity.this, BookActivity.class); intent.putExtra ("Book", bok); startActivity (hensikt););
Her legger du til en onClickListener
til Knapp
Installer du hentet fra Aktivitetsoppsettet. Denne koden vil bli kjørt når Sende inn knappen er klikket.
Legg merke til at vi bare passerer Bok
tilfelle til putExtra ()
. Som vi ser senere, tar Parcelable seg av å serialisere bokdataene til en streng slik at den kan sendes via Intent.
Nå som hovedaktiviteten er fullført, må vi opprette vår BookActivity
så vel som bokklassen for å holde bokinformasjon.
La oss lage en Bok
klasse for å holde informasjon om hver bok.
offentlig klasse Bokredskaper Parcelable // book basics private String title; Private String forfatter;
Denne klassen må gjennomføres Parcelable
. Dette vil gjøre det mulig å overføre data fra Hoved aktivitet
til BookActivity
.
Vi vil også legge til noen standard getter-funksjoner og en konstruktør for raskt å lage en forekomst av klassen.
// main constructor public Book (String title, String author) this.title = title; this.author = author; // getters public String getTitle () retur tittel; offentlig String getAuthor () returforfatter;
De writeToParcel
Metoden er hvor du legger til alle klassedataene dine i pakken. Dette gjøres i forberedelse for overføring. Denne metoden vil bli bestått en pakkeinstans som har en rekke skrivemetoder som du kan bruke til å legge til hvert felt i pakken. Se opp: rekkefølgen der du skriver dataene er viktig!
Slik gjør du det.
// skrive objekt verdier til pakke for lagring offentlig tomt writeToParcel (Parcel dest, int flagg) dest.writeString (title); dest.writeString (forfatter);
Akkurat som skrivemetoden håndterer å skrive dataene som skal overføres, brukes konstruktøren til å lese de overførte dataene tilbake fra det serielle pakken. Denne metoden vil bli kalt mottakeraktiviteten for å samle inn dataene.
Slik ser det ut:
offentlig bok (pakkepakke) title = parcel.readString (); forfatter = parcel.readString ();
Den mottakende aktiviteten vil få dataene som en streng, og vil da ringe til getParcelableExtra
metode for å starte prosessen med å samle dataene. Det vil utløse konstruktøren vi definerte ovenfor, som vil deserialisere dataene og opprette en ny Bok
forekomst.
For å fullføre din delbare klasse må du opprette en Parcelable.Creator
instans og tilordne den til CREATOR
felt. Programmerbar API vil se etter dette feltet når det er behov for å deserialisere en forekomst av klassen din som er blitt overført til en annen komponent.
offentlig statisk endelig Parcelable.CreatorCREATOR = ny Parcelable.Creator () @Override public Book createFromParcel (Parcel pakke) returner ny bok (pakke); @Override public Book [] newArray (int størrelse) returner ny bok [0]; ;
Dette binder alt sammen. Dens jobb er enkel - det genererer forekomster av din delbare klasse fra a Pakke
ved hjelp av pakkedataene som tilbys. Skaperen kaller konstruktøren du definerte ovenfor, og sender den a Pakke
objekt, og konstruktøren initialiserer klassetributtene.
Hvis din delbare klasse vil ha barneklasser, må du ta litt ekstra forsiktighet med describeContents ()
metode. Dette vil la deg identifisere den spesifikke barneklassen som skal opprettes av Parcelable.Creator
. Du kan lese mer om hvordan dette fungerer på Stack Overflow.
Nå kan vi fullføre vår app med bokaktiviteten. Gå videre og opprett en ny, tom aktivitet som heter BookActivity
. Lag oppsettet som det jeg har under.
I activity_book.xml, du trenger bare to TextView
widgets, som vil bli brukt til å vise tittelen og forfatteren av bøkene.
La oss nå sette opp vår aktivitet. Aktiviteten din bør allerede se slik ut:
pakke com.tutsplus.code.android.bookparcel; importer android.support.v7.app.AppCompatActivity; importere android.os.Bundle; offentlig klasse BookActivity utvider AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_book);
I denne aktiviteten vil du motta dataene som ble sendt fra hovedaktiviteten din og vise den på dine synspunkter. Dermed vil du hente forekomstene av din TextView
bruker ID av TextView
sett inn i oppsettet ditt.
TextView mBkTitle = (TextView) findViewById (R.id.bk_title); TextView mBkAuthor = (TextView) findViewById (R.id.bk_author);
Så, selvfølgelig, vil du ringe getIntent ()
fordi du vil hente data i denne aktiviteten. Dataene du vil hente, hentes fra boksklassen ved hjelp av getParcelableExtra ()
. Deretter angir du verdiene til TextViews
til dataene du samlet inn. Slik er det gjort.
Intent Intent = getIntent (); Bokbok = intent.getParcelableExtra ("Book"); mBkTitle.setText ("Tittel:" + book.getTitle ()); mBkAuthor.setText ("Forfatter:" + book.getAuthor ());
Bygg din søknad og start den, og du bør se den lille skjønnheten du nettopp har bygget.
I dette innlegget har du sett hvordan du enkelt kan flytte objekter fra en aktivitet til en annen. Du trenger ikke lenger å hente hvert datafelt du har sendt til Intent-objektet separat, og du trenger ikke å huske navnet du passerte hvert felt under. Ikke bare det, men denne prosessen er raskere enn Java serialiseringsfunksjonalitet.
I denne opplæringen har du lært hvordan du bruker Parcelable til å overføre data fra en aktivitet til en annen. Du kan dykke dypere inn i Parcelable ved å sjekke den offisielle dokumentasjonen.
I mellomtiden kan du sjekke ut noen av våre andre innlegg om Android app-utvikling!