Статьи

Как передавать данные между действиями с Android Parcelable

Нам часто нужно передавать данные между действиями приложения Android. Простой способ сделать это с помощью Intent.putExtra() , но если вам нужно передать много структурированных данных, Parcelable может быть лучшим решением. В этой статье я покажу вам, как Parcelable облегчает сериализацию классов для совместного использования между Activity.

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, вам нужно создать экземпляр 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!

  • Android SDK
    Добавление анимации на основе физики в приложения для Android
    Ашраф Хатхибелагал
  • Android SDK
    Что такое жизненный цикл активности Android?
  • Android SDK
    Как монетизировать ваши приложения для Android с помощью AdMob
    Чике Мгбемена