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 ?
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 ?
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 .
@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.
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é ?
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 ?
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.
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 :
Cons :
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 !
* N'activez pas les plugins Hrisey et Lombok en même temps ou vous obtiendrez une erreur lors du lancement de l'IDE.
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 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 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 (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 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.