Persian (پارسی) translation by Erfan Rezaeimehr (you can also view the original English article)
مقدمه
خیلی اوقات ما نیاز داریم که داده را بین اکتیویتی های یک اپلیکیشن اندرویدی انتقال بدهیم. یک روش راحت برای انجام این کار Intent.putExtra()
هست، اما اگر شما داده ی ساخت یافته زیادی برای انتقال داشته باشید، شاید راه حل بهتر استفاده از Parcelable باشد. در این مقاله به شما نشان میدهم که چگونه Parcelable کار را برای serialize کردن کلاس ها برای به اشتراک گذاشتن بین اکتیویتی ها ساده میکند.
چرا Parcelable ؟
Parcelable یک کلاس رابط ( اینترفیس ) هست، که فقط برای اندروید نوشته شده است. به توسعه دهندگان این امکان را میدهد که یک کلاس را serialize کنند بنابراین تمام خواص آن کلاس به راحتی میتوانند از یک اکتیویتی به اکتیویتی دیگر انتقال پیدا کنند. این کار به وسیله خواندن و نوشتن از روی شی ( آبجکت ) های Parcels انجام میشود ،که میتوان داده های خام داخل message containers را شامل بشود.
ساختن Main Activity و Layout
main Activity ما مجموعه ای از جزئیات کتاب را کنترل و مدیریت میکند. بیاید با راه اندازی مِتُِد OnCreate
شروع کنیم.
package com.tutsplus.code.android.bookparcel; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //... } }
بعد، activity_main.xml را برای راه اندازی view's layout و نمایش آن باز کنید. شما به دو فیلد ورودی متنی و یک دکمه برای ارسال آنها نیاز دارید.
باید چیزی شبیه به این باشه:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="5dp" android:padding="5dp" tools:context="com.tutsplus.code.android.bookparcel.MainActivity"> <EditText android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:padding="20dp" android:textSize="15sp" android:hint="Book Title"/> <EditText android:id="@+id/author" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:padding="20dp" android:textSize="15sp" android:hint="Book Author"/> <Button android:id="@+id/submit_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:text="Submit"/> </LinearLayout>
حالا main Activity را باز کنید و فیلد های ویو را به اکتیویتی تان متصل کنید. باید این کار را در داخل مِتُِد onCreate()
تان انجام بدهید. شبیه به این:
//... final EditText mBkTitle = (EditText) findViewById(R.id.title); final EditText mBkAuthor = (EditText) findViewById(R.id.author); Button button = (Button) findViewById(R.id.submit_button);
برای این که کارِ MainActivity
را تمام کنید، به راه اندازی OnClickListener
نیاز دارید. این مِتُد زمانی که دکمه Submit فشار داده شود، اجرا میشود. وقتی که این اتفاق بی افتد، جزئیات وارد شده جمع آوری شده و به اکتیویتی بعدی ارسال میشوند.
button.setOnClickListener(new 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("Book", book); startActivity(intent); } });
در این قسمت، شما برای نمونهِ Button
که از Activity layout بدست آوردید یک متد onClickListener
اضافه میکنید، این کد زمانی که Submit Button ( دکمه ارسال ) کلیک بشود اجرا خواهد شد.
به این موضوع توجه کنید که ما به راحتی نمونه کلاس Book
را به putExtra()
انتقال میدهیم. همانطور که جلوتر مشاهده میکنید، Parcelable کار serializing کردن دادهِ book را به رشته ی string بر عهده میگیرد، بنابراین به این صورت میتواند به وسیلهِ intent منتقل بشود.
حالا که main Activity کامل شده است، ما نیاز داریم که BookActivity
و همچنین کلاس Book مان را برای نگهداریِ اطلاعات کتاب بسازیم.
ساختن کلاس Book
بیاید یک کلاس Book
برای نگهداری اطلاعات هر کتاب بسازیم.
public class Book implements Parcelable { // book basics private String title; private String author; }
این کلاس به پیاده سازی ( ایمپلمنت ) کردنِ Parcelable
نیاز دارد. این کار انتقال داده از mainActivity
به BookActivity
را فراهم میکند.
همچنین ما چندین تابع استانداردِ دریافت کننده ( getter ) و یک تابع سازنده ( constructor ) برای ساختن سریع یک نمونه از کلاس اضافه میکنیم.
// main constructor public Book(String title, String author) { this.title = title; this.author = author; } // getters public String getTitle() { return title; } public String getAuthor() { return author; }
Write to the Parcel
مِتُدِ writeToParcel
جایی هست که شما تمام داده های کلاس تان را در parcel اضافه میکنید. این کار در زمان آماده سازی برای منتقل شدن انجام میشود. این متد یک نمونه از Parcel را منتقل میکند که یک تعدادی از مِتُدهای وارد کردن را که شما میتوانید برای اضافه کردن هر فیلد از parcel از آنها استفاده کنید را دارد. مراقب باشید: ترتیبی که شما داده ها را وارد میکنید مهم است.
می توانید نحوه انجام این کار را اینجا ملاحظه کنید.
// write object values to parcel for storage public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(author); }
خواندن اطلاعات برگشت داده شده از Parcel
همانطور که مِتُدِ write وارد کردن داده را برای اینکه منتقل بشوند را کنترل و مدیریت کرد، از سازنده ( constructor ) برای خواندن داده های انتقال داده شده از serialized parcel، استفاده میشود. این مِتُد در زمان دریافت کردن اکتیویتی برای جمع آوری داده ها صدا زده میشود.
کدهایتان باید چیزی شبیه به این باشد:
public Book(Parcel parcel) { title = parcel.readString(); author = parcel.readString(); }
اکتیویتی دریافت کننده، داده ها را به عنوان یک رشته ی استرینگی میگیرد، و سپس مِتُدِ getParcelableExtra
را برای شروع پردازشِ جمع آوری داده ها صدا میزند. این کار سازنده یی که ما در بالا مشخص کردیم را برای deserialize کردن داده و ساختن نمونه ی جدید از کلاس Book
به کار می اندازد.
Parcelable.Creator
برای کامل کردن کلاس Parcelable، ما نیاز داریم نمونه Parcelable.Creator
را بسازیم و آن را به فیلد CREATOR
اختصاص بدهیم. The Parcelable API زمانی که نیاز به deserialize کردن یک نمونه از کلاس ما که به یک کامپوننت دیگر منتقل شده، را دارد به دنبال این فیلد میگردد.
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() { @Override public Book createFromParcel(Parcel parcel) { return new Book(parcel); } @Override public Book[] newArray(int size) { return new Book[0]; } };
این همه چیز را با هم مرتبط می کند. کارش ساده است، نمونه هایی از کلاس Parcelable شما را از یک Parcel
با استفاده از داده های ارائه شده تولید میکند. creator، سازنده ( constructor ) ای را که شما در بالا مشخص کردید را صدا میزند، یک شی Parcel
را منتقل میکند، و سازنده attributes های کلاس را مقدار دهی اولیه میکند.
اگر کلاس Parcelable مان، کلاس های فرزندی داشته باشد، شما به گرفتن برخی از مراقبت های اضافی به وسیله ی متد describeContents()
نیاز دارید. این کار به شما اجازه میدهد که کلاس خاصی که باید به وسیله ی Parcelable.Creator
ساخته بشود را شناسایی کنید. شما میتوانید در مورد چگونه کار کردن این موضوع در سایت Stack Overflow بیشتر مطالعه کنید.
اکتیویتی Book و Layout
حالا ما میتوانیم اپلیکیشن مان را با book Activity کامل کنیم. یک اکتیویتی جدید به نام BookActivity
بسازید. layout را مانند چیزی که من در پاین ساختم، بساید.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="5dp" android:padding="5dp" tools:context="com.tutsplus.code.android.bookparcel.BookActivity"> <TextView android:id="@+id/bk_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Book" android:textSize="30sp" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:padding="20dp"/> <TextView android:id="@+id/bk_author" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Author" android:textSize="30sp" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:padding="20dp"/> </LinearLayout>
در activity_book.xml، شما فقط به دو تا ویجت TextView
، که برای نشان دادن عنوان و نام نویسنده کتاب استفاده میشود نیاز دارید.
حالا بیاید اکتیویتی مان را بسازیم. این اکتیویتی باید شبیه به این باشد:
package com.tutsplus.code.android.bookparcel; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class BookActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_book); } }
در این اکتیویتی، ما میخواهیم داده ای که انتقال داده شد، از main Activity را بگیریم و آن را در views نمایش بدهیم. به این صورت ما نمونه هایی از TextView
هایمان را با استفاده از id از TestView
یی که در layout ست کریدم، بدست می آوریم.
TextView mBkTitle = (TextView) findViewById(R.id.bk_title); TextView mBkAuthor = (TextView) findViewById(R.id.bk_author);
البته، سپس، getIntent()
را برای بازیابی داده از این اکتیویتی صدا میزنیم. داده هایی که بازیابی میکنیم، از کلاس Book با استفاده از مِتُدِ getParcelableExtra()
جمع آوری میشوند، بعد، مقادیر را به TextViwes
ها برای داده های جمع آوری شده، اختصاص میدهیم. به این صورت کارمان تمام میشود.
Intent intent = getIntent(); Book book = intent.getParcelableExtra("Book"); mBkTitle.setText("Title:" + book.getTitle()); mBkAuthor.setText("Author:" + book.getAuthor());
اپبیکیشن را بسازید و راه اندازی کنید، و شما باید زیبایی چیزی که ساختید را ببینید.

جمع بندی و نتیجه گیری
در این مقاله، شما ملاحظه کردید که به چه صورت به راحتی توانستیم شی ها را از یک اکتیویتی به اکتیویتی دیگر منتقل کنیم. شما دیگر احتیاجی به بازیابی هر فیلد داده یی که به صورت جداگانه به شی intent منتقل شده ندارید. و شما نیاز نیست نام هر فیلدی را که منتفل میشود را به خاطر بسپارید. نه فقط این، بلکه این پردازش از عملکردِ java's serialize ، سریعتر است.
در این آموزش، شما یاد گرفتید که چطور از Parceable برای منتقل کردن داده ها از یک اکتیویتی به اکتیویتی دیگر استفاده کنید. برای اطلاعات بیشتر نسبت به Parceable میتوانید از مستندات رسمی آن دیدن فرمایید.
در عین حال، میتوانید از مقاله های دیگر ما درباره ی توسعه اندروید دیدن کنید.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post