我怎样才能让我的自定义对象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类:
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"));