introduction
Nous avons souvent besoin de transmettre des données entre les activités d’une application Android. Un moyen simple de le faire est d’utiliser Intent.putExtra(), mais si vous avez beaucoup de données structurées à transmettre, Parcelable peut être une meilleure solution. Dans cet article, je vais vous montrer comment Parcelable facilite la sérialisation des classes pour le partage entre les activités.
Pourquoi Parcelable?
Parcelable est une interface uniquement Android. Il permet aux développeurs de sérialiser une classe afin que ses propriétés soient facilement transférées d’une activité à une autre. Cela se fait en lisant et en écrivant des objets à partir de Parcels, qui peuvent contenir des données aplaties dans des conteneurs de messages.
Création de l’activité principale et de la mise en page
Notre activité principale se chargera de la collecte des détails du livre. Commençons par configurer notre onCreate méthode.
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);
//...
}
}
Ensuite, ouvrez activity_main.xml pour configurer la disposition et l’apparence de la vue. Vous aurez besoin de deux champs de saisie de texte et d’un bouton pour la soumission.
Ça devrait ressembler à ça:
<?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>
Ouvrez maintenant votre activité principale et liez les champs d’affichage à votre activité. Vous devrez le faire dans votre onCreate() méthode, comme ceci:
//...
final EditText mBkTitle = (EditText) findViewById(R.id.title);
final EditText mBkAuthor = (EditText) findViewById(R.id.author);
Button button = (Button) findViewById(R.id.submit_button);
Pour finir MainActivity, vous devez configurer un onClickListener. Ce sera appelé chaque fois que le Soumettre le bouton est enfoncé. Lorsque cela se produit, les détails saisis doivent être collectés et envoyés à l’activité suivante.
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);
}
});
Ici, vous ajoutez un onClickListener à la Button instance que vous avez récupérée de votre mise en page Activité. Ce code sera exécuté chaque fois que le Soumettre bouton est cliqué.
Notez que nous passons simplement le Book instance à putExtra(). Comme nous le verrons plus tard, Parcelable se charge de sérialiser les données du livre en une chaîne afin qu’elles puissent être passées via l’intention.
Maintenant que l’activité principale est terminée, nous devons créer notre BookActivity ainsi que la classe Livre pour contenir des informations sur le livre.
Créer la classe de livre
Créons un Book classe pour contenir des informations sur chaque livre.
public class Book implements Parcelable {
// book basics
private String title;
private String author;
}
Cette classe doit implémenter Parcelable. Cela permettra le passage des données de MainActivity à BookActivity.
Nous ajouterons également des fonctions getter standard et un constructeur pour créer rapidement une instance de la classe.
// 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; }
Écrire dans le colis
le writeToParcel méthode est l’endroit où vous ajoutez toutes vos données de classe au colis. Ceci est fait en préparation du transfert. Cette méthode recevra une instance Parcel qui a un certain nombre de méthodes d’écriture que vous pouvez utiliser pour ajouter chaque champ au colis. Attention: l’ordre dans lequel vous écrivez les données est important!
Voici comment procéder.
// write object values to parcel for storage
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(author);
}
Lire les données du colis
Tout comme la méthode d’écriture gère l’écriture des données à transférer, le constructeur est utilisé pour lire les données transférées à partir du colis sérialisé. Cette méthode sera appelée sur l’activité de réception pour collecter les données.
Voici à quoi cela devrait ressembler:
public Book(Parcel parcel) {
title = parcel.readString();
author = parcel.readString();
}
L’activité réceptrice recevra les données sous forme de chaîne, puis appellera le getParcelableExtra méthode pour démarrer le processus de collecte des données. Cela déclenchera le constructeur que nous avons défini ci-dessus, qui désérialisera les données et créera un nouveau Book exemple.
Colisable.Créateur
Pour compléter votre classe Parcelable, vous devez créer un Parcelable.Creator instance et affectez-la au CREATOR champ. L’API Parcelable recherchera ce champ lorsqu’elle aura besoin de désérialiser une instance de votre classe qui a été transmise à un autre composant.
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];
}
};
Cela lie tout ensemble. Son travail est simple: il génère des instances de votre classe Parcelable à partir d’un Parcel en utilisant les données de colis fournies. Le créateur appelle le constructeur que vous avez défini ci-dessus, en lui passant un Parcel objet et le constructeur initialise les attributs de classe.
Si votre classe Parcelable a des classes enfants, vous devrez faire très attention avec le describeContents() méthode. Cela vous permettra d’identifier la classe enfant spécifique qui doit être créée par le Parcelable.Creator. Vous pouvez En savoir plus sur la façon dont cela fonctionne sur Stack Overflow.
Activité et mise en page du livre
Nous pouvons maintenant compléter notre application avec le livre Activité. Allez-y et créez une nouvelle activité vide appelée BookActivity. Faites ressembler la mise en page à ce que j’ai ci-dessous.
<?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>
dans le activity_book.xmltu n’en as besoin que de deux TextView widgets, qui seront utilisés pour afficher le titre et l’auteur des livres.
Maintenant, mettons en place notre activité. Votre activité devrait déjà ressembler à ceci:
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);
}
}
Dans cette activité, vous souhaitez recevoir les données transmises par votre activité principale et les afficher dans vos vues. Ainsi vous récupérerez les instances de votre TextView en utilisant l’identifiant du TextView défini dans votre mise en page.
TextView mBkTitle = (TextView) findViewById(R.id.bk_title);
TextView mBkAuthor = (TextView) findViewById(R.id.bk_author);
Ensuite, bien sûr, vous appellerez getIntent() car vous récupérerez des données dans cette activité. Les données que vous récupérerez sont collectées à partir de la classe Book en utilisant getParcelableExtra(). Ensuite, vous définissez les valeurs de TextViews aux données que vous avez collectées. Voici comment procéder.
Intent intent = getIntent();
Book book = intent.getParcelableExtra("Book");
mBkTitle.setText("Title:" + book.getTitle());
mBkAuthor.setText("Author:" + book.getAuthor());
Construisez votre application et lancez-la, et vous devriez voir la petite beauté que vous venez de créer.

Conclusion
Dans cet article, vous avez vu comment vous pouvez facilement déplacer des objets d’une activité à une autre. Vous n’avez plus à récupérer séparément chaque champ de données que vous avez transmis à l’objet Intent, et vous n’avez pas à vous souvenir du nom sous lequel vous avez passé chaque champ. Non seulement cela, mais ce processus est plus rapide que la fonctionnalité de sérialisation de Java.
Dans ce didacticiel, vous avez appris à utiliser Parcelable pour transmettre des données d’une activité à une autre. Vous pouvez plonger plus profondément dans Parcelable en vérifiant le documentation officielle.
En attendant, consultez certains de nos autres articles sur le développement d’applications Android!
Soutenez notre effort ❤️
Si vous avez apprécié cet article, pensez à laisser un pourboire pour nous aider à continuer à publier du contenu de qualité.




















