Вступление
Нам часто нужно передавать данные между действиями приложения Android. Простой способ сделать это с помощью Intent.putExtra()
, но если вам нужно передать много структурированных данных, Parcelable может быть лучшим решением. В этой статье я покажу вам, как Parcelable облегчает сериализацию классов для совместного использования между Activity.
Почему Parcelable?
Parcelable — это интерфейс только для Android. Это позволяет разработчикам сериализовать класс, чтобы его свойства легко передавались из одного вида деятельности в другой. Это делается путем чтения и записи объектов из Parcels, которые могут содержать сведенные данные внутри контейнеров сообщений.
Создание основной деятельности и макета
Наша основная деятельность будет касаться сбора информации о книге. Давайте начнем с настройки нашего метода onCreate
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
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, чтобы настроить макет и внешний вид представления. Вам понадобятся два поля для ввода текста и кнопка для отправки.
Это должно выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout xmlns:android=»http://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>
|
Теперь откройте свою основную активность и свяжите поля просмотра с вашей деятельностью. Вы должны будете сделать это внутри вашего onCreate()
, вот так:
1
2
3
4
5
6
7
|
//…
final EditText mBkTitle = (EditText) findViewById(R.id.title);
final EditText mBkAuthor = (EditText) findViewById(R.id.author);
Button button = (Button) findViewById(R.id.submit_button);
<br> |
Чтобы завершить MainActivity
, вам нужно настроить onClickListener
. Он будет вызываться при каждом нажатии кнопки « Отправить» . Когда это происходит, введенные данные должны быть собраны и отправлены на следующий вид деятельности.
01
02
03
04
05
06
07
08
09
10
11
12
|
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);
}
});
|
Здесь вы добавляете onClickListener
к экземпляру Button
, который вы onClickListener
из макета Activity. Этот код будет запускаться при каждом нажатии кнопки « Отправить» .
Обратите внимание, что мы просто передаем экземпляр Book
в putExtra()
. Как мы увидим позже, Parcelable заботится о сериализации данных книги в строку, чтобы они могли быть переданы через Intent.
Теперь, когда основное действие завершено, нам нужно создать нашу BookActivity
а также класс Book для хранения информации о книге.
Создать Книжный Класс
Давайте создадим класс Book
для хранения информации о каждой книге.
1
2
3
4
5
|
public class Book implements Parcelable {
// book basics
private String title;
private String author;
}
|
Этот класс должен реализовать Parcelable
. Это позволит передавать данные из MainActivity
в BookActivity
.
Мы также добавим несколько стандартных функций получения и конструктор для быстрого создания экземпляра класса.
1
2
3
4
5
6
7
8
9
|
// 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;
|
Написать посылку
Метод writeToParcel
— это место, где вы добавляете все данные вашего класса в участок. Это делается при подготовке к передаче. Этот метод будет передан экземпляру Parcel, который имеет несколько методов записи, которые можно использовать для добавления каждого поля в участок. Будьте осторожны: важен порядок, в котором вы пишете данные!
Вот как ты это делаешь.
1
2
3
4
5
|
// write object values to parcel for storage
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(author);
}
|
Считать данные обратно из посылки
Так же, как метод записи обрабатывает запись данных для передачи, конструктор используется для чтения переданных данных обратно из сериализованной посылки. Этот метод будет вызываться при получении данных для сбора данных.
Вот как это должно выглядеть:
1
2
3
4
|
public Book(Parcel parcel) {
title = parcel.readString();
author = parcel.readString();
}
|
Получающее действие получит данные в виде строки, а затем getParcelableExtra
метод getParcelableExtra
чтобы начать процесс сбора данных. Это вызовет конструктор, который мы определили выше, который десериализует данные и создаст новый экземпляр Book
.
Parcelable.Creator
Чтобы завершить класс Parcelable, вам нужно создать экземпляр Parcelable.Creator
и назначить его полю CREATOR
. Parcelable API будет искать это поле, когда ему нужно десериализовать экземпляр вашего класса, который был передан другому компоненту.
01
02
03
04
05
06
07
08
09
10
11
12
|
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
используя предоставленные данные об участках. Создатель вызывает конструктор, который вы определили выше, передавая ему объект Parcel
, и конструктор инициализирует атрибуты класса.
Если ваш класс Parcelable будет иметь дочерние классы, вам нужно будет позаботиться о методе descriptionContents describeContents()
. Это позволит вам определить конкретный дочерний класс, который должен быть создан Parcelable.Creator
. Вы можете прочитать больше о том, как это работает в переполнении стека .
Книжная деятельность и макет
Теперь мы можем дополнить наше приложение книгой «Активность». Создайте новое пустое действие под названием BookActivity
. Сделайте макет похожим на то, что у меня ниже.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?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>
|
В TextView
activity_book.xml вам нужны только два виджета TextView
, которые будут использоваться для отображения названия и автора книг.
Теперь давайте настроим нашу деятельность. Ваша деятельность уже должна выглядеть так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
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);
}
}
|
В этом упражнении вы хотите получить данные, которые были переданы из вашего основного задания, и отобразить их в своих представлениях. Таким образом, вы будете извлекать экземпляры вашего TextView
используя идентификатор TextView
установленный в вашем макете.
1
2
|
TextView mBkTitle = (TextView) findViewById(R.id.bk_title);
TextView mBkAuthor = (TextView) findViewById(R.id.bk_author);
|
Затем, конечно, вы будете вызывать getIntent()
потому что вы будете получать данные в этом упражнении. Данные, которые вы будете получать, собираются из класса Book с помощью getParcelableExtra()
. Затем вы устанавливаете значения TextViews
для собранных вами данных. Вот как это делается.
1
2
3
4
5
|
Intent intent = getIntent();
Book book = intent.getParcelableExtra(«Book»);
mBkTitle.setText(«Title:» + book.getTitle());
mBkAuthor.setText(«Author:» + book.getAuthor());
|
Создайте свое приложение и запустите его, и вы увидите небольшую красоту, которую вы только что создали.
Вывод
В этом посте вы увидели, как можно легко перемещать объекты из одного занятия в другое. Вам больше не нужно извлекать каждое поле данных, которое вы передали объекту Intent отдельно, и вам не нужно запоминать имя, под которым вы передавали каждое поле. Не только это, но и этот процесс быстрее, чем функция сериализации Java.
В этом руководстве вы узнали, как использовать Parcelable для передачи данных из одного действия в другое. Вы можете погрузиться глубже в Parcelable, проверив официальную документацию .
А пока посмотрите другие наши посты о разработке приложений для Android!