我怎样才能让我的自定义对象Parcelable?

我试图让我的对象Parcelable。 但是,我有自定义对象,这些对象有我做的其他自定义对象的ArrayList属性。

什么是最好的方法来做到这一点?

你可以在这里find这里的一些例子(代码在这里) , 在这里

您可以为此创build一个POJO类,但是您需要添加一些额外的代码以使其可以Parcelable。 看看执行情况。

 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]; } }; } 

一旦创build了这个类,就可以像这样通过Intent轻松地传递这个类的对象,并在目标活动中恢复这个对象。

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

在这里,学生是你需要重新捆绑数据的关键。

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

这个例子只显示stringtypes。 但是,你可以打包任何你想要的数据。 试试看。

编辑:另一个例子 ,由Rukmal Diasbuild议。

这里是一个网站,从您创build的类创build一个Parcelable类:

http://www.parcelabler.com/

IntelliJ IDEA和Android Studio有这个插件:

  • ★ Android Parcelable代码生成器 (Apache 许可证 2.0)
  • 自动包裹 (MIT 许可证 )
  • SerializableParcelable Generator (MIT 许可证 )
  • 可分发代码生成器(用于Kotlin) (Apache 许可证 2.0)

这些插件根据类中的字段生成Android Parcelable样板代码。

插件演示

1.导入Android Parcelable code generator

在这里输入图像描述

2.创build一个class级

 public class Sample { int id; String name; } 

3.从菜单生成> Parcelable

在这里输入图像描述 在这里输入图像描述

完成。

怎么样? 带注释。

你只需用一个特殊的注释来注释一个POJO,剩下的就是库。

优点:

  • 代码生成库可以帮助您从样板源代码中解脱出来。
  • 注释使你的课程变得美丽。

缺点:

  • 它适用于简单的类。 制作一个复杂的类可以是棘手的。
  • 龙目岛和AspectJ不能很好的一起玩。 [细节]

赫里斯岛

Hrisey基于龙目岛 。 使用Hrisey的可用类:

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

现在你不需要实现任何Parcelable接口的方法。 Hrisey将在预处理阶段生成所有必需的代码。

在Gradle中的Hrisey依赖关系:

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

在这里看到支持的types。 ArrayList就在其中。

安装插件 – Hrisey xor Lombok * – 为您的IDE,并开始使用其惊人的function!

在这里输入图像描述
*不要启用Hrisey和Lombok插件,否则在启动IDE时会出现错误。


Parceler

使用Parceler的Parcelable类:

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

要使用生成的代码,可以直接引用生成的类,也可以使用Parcels实用程序类引用

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

要解引用@Parcel ,只需调用Parcels类的以下方法

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

Pardleler在Gradle中的依赖关系:

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

在README中查找受支持的属性types 。


AutoParcel

AutoParcel是一个AutoValue扩展,可以生成Parcelable值。

只需将implements Parcelable @AutoValue添加到您的@AutoValue注释模型:

 @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在Gradle构build文件中:

 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}" } 

PaperParcel

PaperParcel是一个注释处理器,为Kotlin和Java自动生成types安全的Parcelable样板代码。 PaperParcel支持Kotlin数据类,Google的AutoValue通过AutoValue扩展,或只是普通的Java bean对象。

来自文档的使用示例。
使用@PaperParcel注释您的数据类,实现PaperParcelable ,并添加一个PaperParcelable.Creator静态实例PaperParcelable.Creator例如:

 @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; } } 

对于Kotlin用户,请参阅Kotlin Usage ; 对于AutoValue用户,请参阅AutoValue Usage 。


ParcelableGenerator

ParcelableGenerator (自述文件是用中文写的,我不明白,欢迎来自英文 – 中文的开发者对这个答案作出贡献)

README中的使用示例。

 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; } } 

android-apt插件协助与Android Studio结合使用注释处理器。

我find了最简单的方法来创buildParcelable类

在这里输入图像描述

这是很容易的,你可以使用android studio的插件来制作对象Parcelables。

 public class Persona implements Parcelable { String nombre; int edad; Date fechaNacimiento; public Persona(String nombre, int edad, Date fechaNacimiento) { this.nombre = nombre; this.edad = edad; this.fechaNacimiento = fechaNacimiento; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.nombre); dest.writeInt(this.edad); dest.writeLong(fechaNacimiento != null ? fechaNacimiento.getTime() : -1); } protected Persona(Parcel in) { this.nombre = in.readString(); this.edad = in.readInt(); long tmpFechaNacimiento = in.readLong(); this.fechaNacimiento = tmpFechaNacimiento == -1 ? null : new Date(tmpFechaNacimiento); } public static final Parcelable.Creator<Persona> CREATOR = new Parcelable.Creator<Persona>() { public Persona createFromParcel(Parcel source) { return new Persona(source); } public Persona[] newArray(int size) { return new Persona[size]; } };} 

现在你可以使用Parceler库来转换你的任何自定义类在parcelable。 只需用@Parcel注释你的POJO类。 例如

  @Parcel public class Example { String name; int id; public Example() {} public Example(int id, String name) { this.id = id; this.name = name; } public String getName() { return name; } public int getId() { return id; } } 

你可以创build一个Example类的对象,并通过Parcel包装并通过intent作为一个bundle来发送。 例如

 Bundle bundle = new Bundle(); bundle.putParcelable("example", Parcels.wrap(example)); 

现在来获取Custom Class对象

 Example example = Parcels.unwrap(getIntent().getParcelableExtra("example")); 

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

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