Дуже часто програмісту доводиться передавати дані з однієї активності в іншу. Коли мова йде про прості типи, то використовується метод intent.putExtra() і йому подібні. Цей спосіб підходить для типів String, int, long або масивів. А ось об'єкти таким чином передати не вийде.

В Java існував спеціальний інтерфейс Serializable, але він виявився занадто неповороткий для мобільних пристроїв і користуватися їм настійно не рекомендується. Для передачі об'єктів слід використовувати інший інтерфейс Parcelable.

В інтерфейсі Parcelable використовуються два методи describeContents() і writeToParcel():

@Override
public int describeContents() {
}

@Override
public void writeToParcel(Parcel dest, int flags) {
}

Метод describeContents() описує різного роду спеціальні об'єкти, що описують інтерфейс.

Метод writeToParcel() упаковує об'єкт для передачі.

Також необхідно реалізувати статичне поле Parcelable.Creator<T> CREATOR, яке генерує об'єкт класу-передавача.

Напишемо приклад. Спробуємо передати об'єкт "Мої документи". Як відомо, ознакою цього документа є Вуса, лапи, хвіст (я ще додав би ім'я). Створимо новий клас DocumentInfo, який реалізує інтерфейс Parcelable:

import android.os.Parcel;
import android.os.Parcelable;
public class DocumentInfo implements Parcelable {
private String mName; // ім'я кота
private String mWhiskers; // вуса
private String mPaws; // лапи
private String mTail; // хвіст
public DocumentInfo(String name, String whiskers, String paws, String tail) {
mName = name;
mWhiskers = whiskers;
mPaws = paws;
mTail = tail;
}
public DocumentInfo(Parcel in) {
String[] data = new String[4];
in.readStringArray(data);
mName = data[0];
mWhiskers = data[1];
mPaws = data[2];
mTail = data[3];
}
public void setCatName(String name) {
mName = name;
}
public String getCatName() {
return mName;
}
public void setWhiskers(String whiskers) {
mWhiskers = whiskers;
}
public String getWhiskers() {
return mWhiskers;
}
public String getPaws() {
return mPaws;
}
public String getTail() {
return mTail;
}
@Override
 public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { mName, mWhiskers, mPaws, mTail });
}
public static final Parcelable.Creator<DocumentInfo> CREATOR = new Parcelable.Creator<DocumentInfo>() {
@Override
public DocumentInfo createFromParcel(Parcel source) {
return new DocumentInfo(source);
}
@Override
public DocumentInfo[] newArray(int size) {
return new DocumentInfo[size];
} }; }

Тепер ми може передати об'єкт через Intent. Створимо дві активності. У першій активності напишемо код для відправки об'єкта:

public void onClick(View view) {
Intent intent = new Intent(TestActivity.this, SecondActivity.class);
intent.putExtra("DocumentInfo", new DocumentInfo("Матроскін", "Довгі", "Білі", "Пухнастий"));
startActivity(intent);
}

Друга активність повинна прийняти дані від першої активності:

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_second);
TextView tvName = (TextView) findViewById(R. id.textView1);
TextView tvWhiskers = (TextView) findViewById(R. id.textView2);
TextView tvPaws = (TextView) findViewById(R. id.textView3);
TextView tvTail = (TextView) findViewById(R. id.textView4);
String name = "";
String whiskers = "";
String paws = "";
String tail = "";
DocumentInfo mydocuments = (DocumentInfo)getIntent().getParcelableExtra("DocumentInfo");
name = mydocuments.getCatName();
whiskers = mydocuments.getWhiskers();
paws = mydocuments.getPaws();
tail = mydocuments.getTail();
tvName.setText("Ім'я кота:" + name);
tvWhiskers.setText("Вуса:" + whiskers);
tvPaws.setText("Лапи:" + paws);
tvTail.setText("Хвіст:" + tail);
}

Отримавши об'єкт з першої активності, ми можемо отримати необхідні дані і розкласти по поличках.

Вікторія Пряжнікова


2016-06-05 • Просмотров [ 36 ]