如何使我的自定义对象可打包?
我正在尝试使我的对象可打包。但是,我有自定义对象,并且这些对象具有我创建的其他自定义对象的 ArrayList 属性。
最好的方法是什么?
I'm trying to make my objects Parcelable. However, I have custom objects and those objects have ArrayList
attributes of other custom objects I have made.
What would be the best way to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
您可以在此处找到一些示例,此处(代码取自此处) 和 此处。
您可以为此创建一个 POJO 类,但您需要添加一些额外的代码以使其可
Parcelable
。看看实施情况。创建此类后,您可以像这样轻松地通过
Intent
传递此类的对象,并在目标 Activity 中恢复该对象。在这里,student 是您从捆绑包中解包数据所需的密钥。
此示例仅显示
String
类型。但是,您可以打包任何您想要的数据。尝试一下。编辑:另一个 示例,由 鲁克马尔·迪亚斯。
You can find some examples of this here, here (code is taken here), and here.
You can create a POJO class for this, but you need to add some extra code to make it
Parcelable
. Have a look at the implementation.Once you have created this class, you can easily pass objects of this class through the
Intent
like this, and recover this object in the target activity.Here, the student is the key which you would require to unparcel the data from the bundle.
This example shows only
String
types. But, you can parcel any kind of data you want. Try it out.EDIT: Another example, suggested by Rukmal Dias.
IntelliJ IDEA 和 Android Studio 有用于此目的的插件:
这些插件生成 Android Parcelable 基于类中字段的样板代码。
IntelliJ IDEA and Android Studio have plugins for this:
These plugins generate Android Parcelable boilerplate code based on fields in the class.
1. 导入
Android Parcelable 代码生成器
2. 创建类
3. 生成 >可从菜单
完成。
1. Import
Android Parcelable code generator
2. Create a class
3. Generate > Parcelable from menu
Done.
如何?带注释。
您只需使用特殊注释对 POJO 进行注释,库即可完成剩下的工作。
优点:
缺点:
赫里西
Hrisey 基于 Lombok。使用 Hrisey 的 Parcelable 类:
现在您不需要实现 Parcelable 接口的任何方法。 Hrisey 将在预处理阶段生成所有必需的代码。
Gradle 中的 Hrisey 依赖项:
请参阅此处了解支持的类型。
ArrayList
就是其中之一。为您的 IDE 安装插件 - Hrisey xor Lombok*,并开始使用其惊人的功能!
* 不要同时启用 Hrisey 和 Lombok 插件,否则您将在 IDE 启动期间收到错误消息。
Parceler
使用 Parceler 的 Parcelable 类:
要使用生成的代码,您可以直接引用生成的类,或者通过
Parcels
实用程序类使用要取消引用
@Parcel
,只需在 Gradle 依赖项中调用Parcels
类 Parceler 的以下:
方法 自述文件,了解受支持的属性类型。
AutoParcel
AutoParcel 是一个 AutoValue 扩展,可生成 Parcelable 值。
只需将
implements Parcelable
添加到您的@AutoValue
带注释的模型中:Gradle 构建文件中的 AutoParcel:
PaperParcel
PaperParcel 是一个注释处理器,可以自动为 Kotlin 和 Java 生成类型安全的 Parcelable 样板代码。 PaperParcel 支持 Kotlin 数据类、通过 AutoValue 扩展的 Google AutoValue,或者仅支持常规 Java bean 对象。
来自文档的用法示例。
使用
@PaperParcel
注释您的数据类,实现PaperParcelable
,并添加PaperParcelable.Creator
的 JVM 静态实例,例如:对于 Kotlin 用户,请参阅 < a href="https://github.com/grandstaish/paperparcel/wiki/Kotlin-Usage" rel="nofollow noreferrer">Kotlin 用法;对于 AutoValue 用户,请参阅 AutoValue 使用。
ParcelableGenerator
ParcelableGenerator (README是中文写的,看不懂。贡献于此欢迎中英文开发者的回答)
来自 自述文件。
android-apt 插件有助于与 Android Studio 结合使用注释处理器。
How? With annotations.
You simply annotate a POJO with a special annotation and library does the rest.
Pros:
Cons:
Hrisey
Hrisey is based on Lombok. Parcelable class using Hrisey:
Now you don't need to implement any methods of Parcelable interface. Hrisey will generate all required code during preprocessing phase.
Hrisey in Gradle dependencies:
See here for supported types. The
ArrayList
is among them.Install a plugin - Hrisey xor Lombok* - for your IDE and start using its amazing features!
* Don't enable Hrisey and Lombok plugins together or you'll get an error during IDE launch.
Parceler
Parcelable class using Parceler:
To use the generated code, you may reference the generated class directly, or via the
Parcels
utility class usingTo dereference the
@Parcel
, just call the following method ofParcels
classParceler in Gradle dependencies:
Look in README for supported attribute types.
AutoParcel
AutoParcel is an AutoValue extension that enables Parcelable values generation.
Just add
implements Parcelable
to your@AutoValue
annotated models:AutoParcel in Gradle build file:
PaperParcel
PaperParcel is an annotation processor that automatically generates type-safe Parcelable boilerplate code for Kotlin and Java. PaperParcel supports Kotlin Data Classes, Google's AutoValue via an AutoValue Extension, or just regular Java bean objects.
Usage example from docs.
Annotate your data class with
@PaperParcel
, implementPaperParcelable
, and add a JVM static instance ofPaperParcelable.Creator
e.g.:For Kotlin users, see Kotlin Usage; For AutoValue users, see AutoValue Usage.
ParcelableGenerator
ParcelableGenerator (README is written in Chinese and I don't understand it. Contributions to this answer from english-chinese speaking developers are welcome)
Usage example from README.
The android-apt plugin assists in working with annotation processors in combination with Android Studio.
在 Android Studio 中创建不带插件的 Parcelable 类
在您的类中实现 Parcelable,然后将光标放在“implements Parcelable”上并按
Alt+Enter
并选择添加 Parcelable 实现< /代码>(见图)。就是这样。
Create Parcelable class without plugin in Android Studio
implements Parcelable in your class and then put cursor on "implements Parcelable" and hit
Alt+Enter
and selectAdd Parcelable implementation
(see image). that's it.我找到了创建 Parcelable 类
I have found simplest way to create Parcelable class
这很简单,你可以使用android studio上的插件来制作对象Parcelables。
It is very easy, you can use a plugin on android studio to make objects Parcelables.
我尝试使用Parcellable,时间很短,所以使用Gson如下。也许它可以帮助其他人......
以上都是模型对象。我希望它从 LoginActivity.class 传递到 MainActivity.class。 Parcellable 不适用于大型模型,并且需要时间进行更改。所以我这样做了,
在 MainActivity.class 中检索这些对象
I tried to use Parcellable, time was short, So used Gson as below. May be it could help few others...
The above both are model objects. I wanted it to pass to MainActivity.class from LoginActivity.class. Parcellable was not working with huge models and would take time to make changes..So I did this,
Retrieve these objects in MainActivity.class
现在您可以使用 Parceler 库将您的任何自定义类转换为 Parcelable。只需使用 @Parcel 注释您的 POJO 类即可。
例如,
您可以创建示例类的对象并包装包裹并通过意图作为捆绑包发送。例如
现在要获取自定义类对象只需使用
Now you can use Parceler library to convert your any custom class in parcelable. Just annotate your POJO class with @Parcel.
e.g.
you can create an object of Example class and wrap through Parcels and send as a bundle through intent. e.g
Now to get Custom Class object just use
Android parcable 有一些独特的东西。这些内容如下:
例子:
要创建 Parceble 类,它必须实现 Parceble。 Percable 有 2 个方法:
假设您有一个 Person 类,它有 3 个字段,名字、姓氏和年龄。实现 Parceble 接口后。该接口如下所示:
在
writeToParcel
方法中,我们按顺序在 Parcel 上写入/添加数据。之后,我们必须添加以下代码以从包中读取数据:这里,Person 类正在获取包并在写入期间以相同的顺序获取数据。
现在,在意图
getExtra
和putExtra
期间给出如下代码:放入额外:
获取额外:
Full人员类别如下:
Android parcable has some unique things. Those are given bellow:
Example:
To make a class Parceble it must be implement Parceble. Percable has 2 method:
Suppose you have a Person class and it has 3 field, firstName,lastName and age. After implementing Parceble interface. this interface is given bellow:
Here
writeToParcel
method we are writing/adding data on Parcel in an order. After this we have to add bellow code for reading data from parcel:Here, Person class is taking a parcel and getting data in same an order during writing.
Now during intent
getExtra
andputExtra
code is given bellow:Put in Extra:
Get Extra:
Full Person class is given bellow:
放置:
bundle.putSerialized("key",(Serializing) object);
获取:
列表<对象> obj = (List
To put:
bundle.putSerializable("key",(Serializable) object);
To get:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));