353 votes

Comment puis-je rendre mes objets personnalisés parcelables ?

J'essaie de rendre mes objets parcelables. Cependant, j'ai des objets personnalisés et ces objets ont des propriétés ArrayList des attributs d'autres objets personnalisés que j'ai fabriqués.

Quelle serait la meilleure façon de procéder ?

0voto

mesuk 08308 Points 16

Android parcable présente des caractéristiques uniques. Celles-ci sont présentées ci-dessous :

  1. Vous devez lire Parcel dans le même ordre que celui dans lequel vous avez placé les données sur Parcel.
  2. Le colis se videra après avoir été lu. C'est-à-dire que si vous avez 3 données sur votre parcelle. Après avoir été lue 3 fois, la parcelle sera vide.

Exemple : Pour qu'une classe soit Parceble, il faut qu'elle soit implémentée Parceble. Percable a 2 méthodes :

int describeContents();
void writeToParcel(Parcel var1, int var2);

Supposons que vous ayez une classe Personne et qu'elle comporte 3 champs, prénom, nom et âge. Après avoir implémenté l'interface Parceble, cette interface est décrite ci-dessous :

import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable{
    private String firstName;
    private String lastName;
    private int age;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(firstName);
        parcel.writeString(lastName);
        parcel.writeInt(age);
    }

}

Ici writeToParcel nous écrivons/ajoutons des données sur les colis dans un ordre. Ensuite, nous devons ajouter le code ci-dessous pour lire les données du colis :

protected Person(Parcel in) {
        firstName = in.readString();
        lastName = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

Ici, la classe de personnes prend un colis et obtient des données dans le même ordre pendant l'écriture.

Maintenant, pendant l'intention getExtra y putExtra est donné ci-dessous :

Ajouter un supplément :

Person person=new Person();
                person.setFirstName("First");
                person.setLastName("Name");
                person.setAge(30);

                Intent intent = new Intent(getApplicationContext(), SECOND_ACTIVITY.class);
                intent.putExtra()
                startActivity(intent); 

Obtenez un supplément :

Person person=getIntent().getParcelableExtra("person");

La classe de personne complète est donnée ci-dessous :

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable{
    private String firstName;
    private String lastName;
    private int age;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(firstName);
        parcel.writeString(lastName);
        parcel.writeInt(age);
    }

    protected Person(Parcel in) {
        firstName = in.readString();
        lastName = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

}

Hope this will help you 
Thanks :)

-3voto

Macário Points 1

A mettre : bundle.putSerializable("key",(Serializable) object);

A obtenir : List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));

3 votes

Cela conduira à ClassCastException si l'objet n'implémente pas Serializable .

1 votes

Bien que cet extrait de code puisse résoudre la question, y compris une explication contribue réellement à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question pour les lecteurs à venir, et que ces derniers pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas encombrer votre code de commentaires explicatifs, car cela réduit la lisibilité du code et des explications !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X