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 ?

441voto

fiction Points 4261

En voici quelques exemples aquí , ici (le code est pris ici) y aquí .

Vous pouvez créer une classe POJO pour cela, mais vous devez ajouter un peu de code supplémentaire pour la rendre Parcelable . Jetez un coup d'œil à la mise en œuvre.

public class Student implements Parcelable{
        private String id;
        private String name;
        private String grade;

        // Constructor
        public Student(String id, String name, String grade){
            this.id = id;
            this.name = name;
            this.grade = grade;
       }
       // Getter and setter methods
       .........
       .........

       // Parcelling part
       public Student(Parcel in){
           String[] data = new String[3];

           in.readStringArray(data);
           // the order needs to be the same as in writeToParcel() method
           this.id = data[0];
           this.name = data[1];
           this.grade = data[2];
       }

       @Оverride
       public int describeContents(){
           return 0;
       }

       @Override
       public void writeToParcel(Parcel dest, int flags) {
           dest.writeStringArray(new String[] {this.id,
                                               this.name,
                                               this.grade});
       }
       public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
           public Student createFromParcel(Parcel in) {
               return new Student(in); 
           }

           public Student[] newArray(int size) {
               return new Student[size];
           }
       };
   }

Une fois que vous avez créé cette classe, vous pouvez facilement faire passer des objets de cette classe par la fonction Intent comme ceci, et récupérer cet objet dans l'activité cible.

intent.putExtra("student", new Student("1","Mike","6"));

Ici, l'étudiant est la clé dont vous avez besoin pour séparer les données de la liasse.

Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");

Cet exemple ne montre que String types. Mais vous pouvez parcelliser n'importe quel type de données. Essayez-le.

EDIT : Un autre exemple , suggéré par Rukmal Dias .

0 votes

@Rukmal Dias 10x. En fait, je dois éditer ma réponse et ajouter du code, car ces liens ne seront plus actifs un jour ou l'autre.

19 votes

OP demande comment passer des objets personnalisés au lieu d'une chaîne de caractères normale. Tout le monde peut passer des chaînes de caractères normales. Pourriez-vous expliquer comment créer un objet personnalisé ?

0 votes

Dois-je réellement implémenter les parties encodage/décodage si je les envoie uniquement en utilisant LocalBroadcastManager ? Est-il suffisant d'implémenter Parcelable et de le mettre en supplément ?

194voto

francisco_ssb Points 2847

Voici un site web qui permet de créer une classe parcellaire à partir de la classe que vous avez créée :

http://www.parcelabler.com/

118voto

naXa Points 862

IntelliJ IDEA et Android Studio disposent de plugins pour cela :

Ces plugins permettent de générer des fichiers Android Parcellaire un code type basé sur les champs de la classe.

Plugin demo

58voto

kenju Points 5248

1. Importer Android Parcelable code generator

enter image description here

2. Créer une classe

public class Sample {
    int id;
    String name;
}

3. Générer > Parcelable dans le menu

enter image description here enter image description here

Fait.

21voto

naXa Points 862

Comment ? Avec des annotations.

Il suffit d'annoter un POJO avec une annotation spéciale et la bibliothèque fait le reste.

Attention !

Je ne suis pas sûr que Hrisey, Lombok et d'autres bibliothèques de génération de code soient compatibles avec le nouveau système de construction d'Android. Ils peuvent ou ne peuvent pas jouer gentiment avec le code d'échange à chaud (i.e. jRebel, Instant Run).

Pour :

  • Les bibliothèques de génération de code vous épargnent le code source standard.
  • Les annotations embellissent votre classe.

Cons :

  • Il fonctionne bien pour les classes simples. Rendre une classe complexe parcellisable peut s'avérer délicat.
  • Lombok et AspectJ ne font pas bon ménage. [détails]
  • Voir mes avertissements.

Hrisey

Attention !

Hrisey a un problème connu avec Java 8 et ne peut donc pas être utilisé pour le développement d'Android aujourd'hui. Voir aussi #1 Erreurs de symboles introuvables (JDK 8) .

Hrisey est basé sur Lombok . Classe parcellaire utilisant Hrisey :

@hrisey.Parcelable
public final class POJOClass implements android.os.Parcelable {
    /* Fields, accessors, default constructor */
}

Il n'est plus nécessaire d'implémenter les méthodes de l'interface Parcelable. Hrisey générera tout le code nécessaire pendant la phase de prétraitement.

Hrisey dans les dépendances de Gradle :

provided "pl.mg6.hrisey:hrisey:${hrisey.version}"

Voir ici pour les types pris en charge. Les ArrayList en fait partie.

Installez un plugin - Hrisey ou Lombok* - pour votre IDE et commencez à utiliser ses incroyables fonctionnalités !

enter image description here
* N'activez pas les plugins Hrisey et Lombok en même temps ou vous obtiendrez une erreur lors du lancement de l'IDE.


Parceler

Classe parcellaire utilisant Parceler :

@java.org.parceler.Parcel
public class POJOClass {
    /* Fields, accessors, default constructor */
}

Pour utiliser le code généré, vous pouvez faire référence à la classe générée directement ou par l'intermédiaire de l'option Parcels à l'aide de la classe utilitaire

public static <T> Parcelable wrap(T input);

Pour déréférencer le @Parcel Il suffit d'appeler la méthode suivante de Parcels classe

public static <T> T unwrap(Parcelable input);

Parceler dans les dépendances de Gradle :

compile "org.parceler:parceler-api:${parceler.version}"
provided "org.parceler:parceler:${parceler.version}"

Regarder à l'intérieur LISEZ-MOI pour les personnes bénéficiant d'un soutien types d'attributs .


AutoParcel

AutoParcel est un AutoValue qui permet de générer des valeurs parcellaires.

Il suffit d'ajouter implements Parcelable à votre @AutoValue modèles annotés :

@AutoValue
abstract class POJOClass implements Parcelable {
    /* Note that the class is abstract */
    /* Abstract fields, abstract accessors */

    static POJOClass create(/*abstract fields*/) {
        return new AutoValue_POJOClass(/*abstract fields*/);
    }
}

AutoParcel dans le fichier de construction Gradle :

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

repositories {
    /*...*/
    maven {url "https://clojars.org/repo/"}
}

dependencies {
    apt "frankiesardo:auto-parcel:${autoparcel.version}"
}

Colis en papier

Colis en papier est un processeur d'annotations qui génère automatiquement du code Parcelable sécurisé pour Kotlin et Java. PaperParcel prend en charge les classes de données Kotlin, l'AutoValue de Google via une extension AutoValue, ou tout simplement les objets Java Bean.

Exemple d'utilisation documents .
Annotez votre classe de données avec @PaperParcel , mettre en œuvre PaperParcelable et ajouter une instance statique JVM de PaperParcelable.Creator par exemple :

@PaperParcel
public final class Example extends PaperParcelable {
    public static final PaperParcelable.Creator<Example> CREATOR = new PaperParcelable.Creator<>(Example.class);

    private final int test;

    public Example(int test) {
        this.test = test;
    }

    public int getTest() {
        return test;
    }
}

Pour les utilisateurs de Kotlin, voir Utilisation de Kotlin Pour les utilisateurs d'AutoValue, voir Utilisation d'AutoValue .


Générateur de parcelles

Générateur de parcelles (Le README est écrit en chinois et je ne le comprends pas. Les contributions à cette réponse de la part de développeurs parlant anglais et chinois sont les bienvenues)

Exemple d'utilisation LISEZ-MOI .

import com.baoyz.pg.Parcelable;

@Parcelable
public class User {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

}

En Android-apt aide à travailler avec des processeurs d'annotation en combinaison avec Android Studio.

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