Photo par pxhere.com

Comment utiliser les Parcelable avec Xamarin.Android

Quand vous développez une application Xamarin.Android, vous avez souvent besoin de passer des paramètres entre les activités.

Posted by Damien Aicheh on May 26, 2018 · 11 mins

Qu’est-ce qu’un Parcelable

Quand vous développez une application Xamarin.Android, vous avez souvent besoin de passer des paramètres entre les activités. Android vous offre différentes façons pour le faire, l’une d’entre elles est d’utiliser les Parcelables.

Les Parcelables vous donne la possibilité de passer un modèle entier entre deux activités d’une application Android.

Pour commencer ce tutoriel, vous trouverez un projet de démarrage sur Github.

Ce projet est un simple projet Xamarin.Android avec une library .Net Standard pour le code commun. Le but de ce tutoriel est de passer un modèle entre deux activités.

Dans notre scénario nous avons une première activité : MainActivity pour être original ;) qui nous affiche le nom et le prénom d’un utilisateur. Nous avons toutes les données de l’utilisateur dans cette activité et nous voulons les passer dans l’autre activité : DetailActivity.

Le modèle que nous allons passer entre les activités est un User :

public class User
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int Age { get; set; }

    public string Address { get; set; }

    public string City { get; set; }

    public string Country { get; set; }
}

Si vous lancez l’application maintenant, vous aurez une page simple, avec le nom et prénom affiché ainsi qu’un bouton. Rien d’extraordinaire pour le moment.

Créer le Parcelable

Dans notre projet Xamarin.Android nous avons besoin de créer une classe qui sera un parcelable, cela vous permettra de passer un User d’une activité à une autre.

Créons un nouveau dossier que l’on appellera : Parcelables et dans celui-ci créez le fichier : UserParcelable

Tout d’abord nous devons implémenter Java.Lang.Object et IParcelable :

public class UserParcelable : Java.Lang.Object, IParcelable
{
    public UserParcelable()
    {
    }

    public int DescribeContents()
    {
        throw new NotImplementedException();
    }

    public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags)
    {
        throw new NotImplementedException();
    }
}

Le constructeur par défaut est obligatoire pour la classe Parcelable Creator que nous verrons plus loin dans ce tutoriel.

Passer un objet en utilisant un Parcelable consiste à le sérialiser et désérialiser. C’est le même concept que l’utilisation de JSON lorsque vous appelez une API.

Tout d’abord ajoutons un objet User à notre classe.

public User User { get; set; }

Sérialisation

Pour passer les données dans le Parcelable nous avons besoins d’utiliser un Parcel, il contient les données et références d’objets que nous voulons envoyer.

La méthode WriteToParcel est la partie de sérialisation :

public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags)
{
    dest.WriteLong(User.Id);
    dest.WriteString(User.FirstName);
    dest.WriteString(User.LastName);
    dest.WriteInt(User.Age);
    dest.WriteString(User.Address);
    dest.WriteString(User.City);
    dest.WriteString(User.Country);
}

Comme nous pouvons le voir ci-dessus, nous devons écrire chacun des paramètres dans l’objet Parcel en fonction de leur type (Long, Int, String…)

La méthode DescribeContents décrit le type d’objets complexes contenus dans ce Parcelable. Dans notre exemple, parce que nous avons seulement des types simples dans notre modèle User, nous avons juste besoin d’écrire return 0.

public int DescribeContents()
{
    return 0;
}

Désérialisation

Nous avons maintenant besoin de créer le constructeur du Parcelable et assigner de nouveau tous les paramètres de notre modèle User dans le même ordre que nous l’avions défini dans la méthode WriteToParcel :

private UserParcelable(Parcel parcel)
{
    User = new User
    {
        Id = parcel.ReadLong(),
        FirstName = parcel.ReadString(),
        LastName = parcel.ReadString(),
        Age = parcel.ReadInt(),
        Address = parcel.ReadString(),
        City = parcel.ReadString(),
        Country = parcel.ReadString()
    };
}

Instanciation

Maintenant nous avons besoin de créer une autre classe qui créera les instances de notre classe UserParcelable.

Voici une classe générique que vous pouvez ajouter à votre dossier Parcelables. Ainsi, vous pourrez l’utiliser pour chaque nouveau Parcelable que vous allez créer.

public class GenericParcelableCreator<T> : Java.Lang.Object, IParcelableCreator where T : Java.Lang.Object, new()
{
    /// <summary>
    /// Function for the creation of a parcel.
    /// </summary>
    private readonly Func<Parcel, T> _createFunc;

    /// <summary>
    /// Initialize an instance of the GenericParcelableCreator.
    /// </summary>
    public GenericParcelableCreator(Func<Parcel, T> createFromParcelFunc)
    {
        _createFunc = createFromParcelFunc;
    }

    /// <summary>
    /// Create a parcelable from a parcel.
    /// </summary>
    public Java.Lang.Object CreateFromParcel(Parcel parcel)
    {
        return _createFunc(parcel);
    }

    /// <summary>
    /// Create an array from the parcelable class.
    /// </summary>
    public Java.Lang.Object[] NewArray(int size)
    {
        return new T[size];
    }
}

Nous pouvons donc utiliser cette classe dans notre classe UserParcelable:

private static readonly GenericParcelableCreator<UserParcelable> _creator
            = new GenericParcelableCreator<UserParcelable>((parcel) => new UserParcelable(parcel));

[ExportField("CREATOR")]
public static GenericParcelableCreator<UserParcelable> GetCreator()
{
    return _creator;
}

Cela va créer une instance de l’objet Parcelable pour nous.

Utilisation du Parcelable

Maintenant que nous sommes prêts à transmettre des données entre nos deux pages, revenons à la MainActivity et dans le méthode SeeMoreBtn_Click que j’ai déjà préparé pour vous, nous devons créer un objet Parcelable et l’envoyer au DetailActivity en utilisant le PutExtra:

Intent intent = new Intent(this, typeof(DetailActivity));

UserParcelable parcelable = new UserParcelable();
parcelable.User = _user;
intent.PutExtra(DetailActivity.UserParcelableExtra, parcelable);

StartActivity(intent);

Dans la DetailActivity nous recevons notre objet User, pour cela, ajoutez ces lignes dans la méthode OnCreate:

UserParcelable parcelable = (UserParcelable)Intent.GetParcelableExtra(UserParcelableExtra);
UpdateView(parcelable.User);

Si vous compilez votre projet vous obtiendrez cette erreur :

Error XA4210: You need to add a reference to Mono.Android.Export.dll when you use ExportAttribute or ExportFieldAttribute. (XA4210)

Comme l’erreur l’indique, nous devons éditer les références de notre projet Xamarin.Android et ajouter le Mono.Android.Export.dll pour que cela fonctionne.

Maintenant recompilez votre projet, et vous verrez les données de l’utilisateur dans la DetailActivity.

Félicitations ! Maintenant vous savez comment utiliser les Parcelables dans vos projets Xamarin.Android !

Vous trouverez tout le code source dans la branche final du répertoire Github.

Happy codding !

Vous avez aimé ce tutoriel ? Laissez une étoile sur le répertoire Github associé !

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !