Vi behöver ofta skicka data mellan Aktiviteter i en Android-app. Ett enkelt sätt att göra detta är med Intent.putExtra ()
, men om du har mycket strukturerade data för att passera, kan Parcelable vara en bättre lösning. I det här inlägget visar jag hur Parcelable gör det enkelt att serialisera klasser för att dela mellan aktiviteter.
Parcelable är ett Android-only-gränssnitt. Det gör det möjligt för utvecklare att serialisera en klass så att dess egenskaper enkelt överförs från en aktivitet till en annan. Detta görs genom att läsa och skriva objekt från Parcels, som kan innehålla utplattad data i meddelandebehållare.
Vår huvudsakliga aktivitet kommer att hantera samlingen av bokinformationen. Låt oss börja med att skapa vår onCreate
metod.
paketet com.tutsplus.code.android.bookparcel; importera android.support.v7.app.AppCompatActivity; importera android.os.Bundle; public class MainActivity utökar AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // ...
Nästa, öppna activity_main.xml för att konfigurera vyens layout och utseende. Du behöver två textfält och en knapp för inlämning.
Det ska se ut så här:
Öppna nu din huvudaktivitet och länka vyfälten till din aktivitet. Du måste göra det inuti din onCreate ()
metod, så här:
// ... final EditText mBkTitle = (EditText) findViewById (R.id.title); Final EditText mBkAuthor = (EditText) findViewById (R.id.author); Knappknapp = (Knapp) findViewById (R.id.submit_button);
För att avsluta Huvudaktivitet
, du måste ställa in en onClickListener
. Detta kommer att kallas när Lämna knappen trycks in. När det händer ska de inmatade uppgifterna samlas in och skickas till nästa aktivitet.
button.setOnClickListener (new View.OnClickListener () @Override public void onClick (Visa v) Bokbok = ny bok (mBkTitle.getText (). toString (), mBkAuthor.getText (). toString ()); = Ny Intent (MainActivity.this, BookActivity.class); intention.putExtra ("Book", bok); startActivity (intention););
Här lägger du till en onClickListener
till Knapp
exempel du hämtat från din aktivitetslayout. Denna kod kommer att köras när Lämna knappen klickas.
Observera att vi helt enkelt passerar bok
till exempel putExtra ()
. Som vi ser senare, tar Parcelable hand om serialisering av bokdata till en sträng så att den kan överföras via avsikt.
Nu när huvudaktiviteten är klar måste vi skapa vår BookActivity
såväl som bokklassen för att hålla bokinformation.
Låt oss skapa en bok
klass för att hålla info om varje bok.
public class Book implementer Parcelable // boken basics private String title; privatsträngare författare;
Denna klass måste genomföras Parcelable
. Detta gör det möjligt att överföra data från Huvudaktivitet
till BookActivity
.
Vi lägger också till några standard getter-funktioner och en konstruktör för att snabbt skapa en förekomst av klassen.
// huvudkonstruktörens offentliga bok (String title, String author) this.title = title; this.author = author; // getters public String getTitle () return title; Offentlig String getAuthor () Returförfattare;
De writeToParcel
Metod är där du lägger till all din klassdata till paketet. Detta görs för att förbereda överföringen. Den här metoden kommer att skickas till ett paket-instans som har ett antal skrivmetoder som du kan använda för att lägga till varje fält i paketet. Se upp: Ordern där du skriver data är viktig!
Så här gör du det.
// skriva objektvärden till paket för lagring public void writeToParcel (Parcel dest, int flaggor) dest.writeString (title); dest.writeString (författare);
Precis som skrivmetoden hanterar att skriva data som ska överföras används konstruktorn för att läsa överförda data tillbaka från det serialiserade paketet. Denna metod kommer att kallas på mottagningsaktiviteten för att samla in data.
Så här ska det se ut:
allmän bok (paketpaket) title = parcel.readString (); författare = parcel.readString ();
Den mottagande aktiviteten kommer att få data som en sträng och kommer då att ringa till getParcelableExtra
metod för att starta processen med att samla in data. Det kommer att utlösa konstruktören vi definierade ovan, vilket kommer att deserialisera data och skapa en ny bok
exempel.
För att slutföra din jämförbara klass måste du skapa en Parcelable.Creator
instans och tilldela den till SKAPARE
fält. API-paketet letar efter det här fältet när det behöver deserialiseras en förekomst av din klass som har överförts till en annan komponent.
offentlig statisk slutlig Parcelable.CreatorCREATOR = ny Parcelable.Creator () @Override public Book createFromParcel (Parcel paket) returnera ny bok (paket); @Override public Book [] newArray (int size) returnera ny bok [0]; ;
Detta binder allt ihop. Dess jobb är enkelt - det genererar instanser av din jämförbara klass från en Paket
med hjälp av paketinformationen som tillhandahålls. Skaparen kallar konstruktören du definierade ovan och skickar den a Paket
objekt och konstruktorn initierar klassattributen.
Om din jämförbara klass kommer att ha barnklasser, måste du ta extra försiktighet med describeContents ()
metod. Detta låter dig identifiera den specifika barnklassen som ska skapas av Parcelable.Creator
. Du kan läsa mer om hur det här fungerar på Stack Overflow.
Nu kan vi slutföra vår app med bokaktiviteten. Fortsätt och skapa en ny tom aktivitet som heter BookActivity
. Gör layouten så som vad jag har nedan.
I activity_book.xml, du behöver bara två Textview
widgets, som kommer att användas för att visa titeln och författaren till böckerna.
Nu ska vi inrätta vår verksamhet. Din verksamhet borde redan se ut så här:
paketet com.tutsplus.code.android.bookparcel; importera android.support.v7.app.AppCompatActivity; importera android.os.Bundle; public class BookActivity utökar AppCompatActivity @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_book);
I den här aktiviteten vill du ta emot de data som skickades från din huvudsakliga aktivitet och visa den på dina synpunkter. Således kommer du att hämta dina exempel Textview
använder ID av Textview
Ange i din layout.
TextView mBkTitle = (TextView) findViewById (R.id.bk_title); TextView mBkAuthor = (TextView) findViewById (R.id.bk_author);
Då förstår du naturligtvis getIntent ()
eftersom du kommer att hämta data i den här aktiviteten. Uppgifterna som du hämtar samlas in från boksklassen med getParcelableExtra ()
. Därefter ställer du in värdena för TextViews
till de data du samlade in. Så här är det gjort.
Avsikten med avsikt = getIntent (); Bokbok = intent.getParcelableExtra ("Book"); mBkTitle.setText ("Titel:" + book.getTitle ()); mBkAuthor.setText ("Författare:" + book.getAuthor ());
Bygg din ansökan och starta den, och du bör se den lilla skönheten du just byggt.
I det här inlägget har du sett hur du enkelt kan flytta objekt från en aktivitet till en annan. Du behöver inte längre hämta varje datafält som du skickat till Intent-objektet separat, och du behöver inte komma ihåg det namn som du passerade varje fält under. Inte bara det, men processen är snabbare än Java serialiseringsfunktionalitet.
I den här handledningen har du lärt dig hur du använder Parcelable för att skicka data från en aktivitet till en annan. Du kan dyka djupare in i Parcelable genom att kontrollera den officiella dokumentationen.
Under tiden, kolla in några av våra andra inlägg om Android app utveckling!