kotlin - Parcelable implementations generator
本文摘自——https://kotlinlang.org/docs/tutorials/android-plugin.html
Android Extensions plugin provides Parcelable
implementation generator as an experimental feature. To be able to use it, turn on the experimental flag.
How to use
Annotate the class with @Parcelize
, and a Parcelable
implementation will be generated automatically.
import kotlinx.android.parcel.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable
@Parcelize
requires all serialized properties to be declared in the primary constructor. Android Extensions will issue a warning on each property with a backing field declared in the class body. Also, @Parcelize
can't be applied if some of the primary constructor parameters are not properties.
If your class requires more advanced serialization logic, you can write it inside a companion class:
@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
private companion object : Parceler<User> {
override fun User.write(parcel: Parcel, flags: Int) {
// Custom write implementation
} override fun create(parcel: Parcel): User {
// Custom read implementation
}
}
}
Supported types
@Parcelize
supports a wide range of types:
- primitive types (and their boxed versions);
- objects and enums;
String
,CharSequence
;Exception
;Size
,SizeF
,Bundle
,IBinder
,IInterface
,FileDescriptor
;SparseArray
,SparseIntArray
,SparseLongArray
,SparseBooleanArray
;- all
Serializable
(yes,Date
is supported too) andParcelable
implementations; - collections of all supported types:
List
(mapped toArrayList
),Set
(mapped toLinkedHashSet
),Map
(mapped toLinkedHashMap
);- Also a number of concrete implementations:
ArrayList
,LinkedList
,SortedSet
,NavigableSet
,HashSet
,LinkedHashSet
,TreeSet
,SortedMap
,NavigableMap
,HashMap
,LinkedHashMap
,TreeMap
,ConcurrentHashMap
;
- Also a number of concrete implementations:
- arrays of all supported types;
- nullable versions of all supported types.
Custom Parceler
s
Even if your type is not supported directly, you can write a Parceler
mapping object for it.
class ExternalClass(val value: Int) object ExternalClassParceler : Parceler<ExternalClass> {
override fun create(parcel: Parcel) = ExternalClass(parcel.readInt()) override fun ExternalClass.write(parcel: Parcel, flags: Int) {
parcel.writeInt(value)
}
}
External parcelers can be applied using @TypeParceler
or @WriteWith
annotations:
// Class-local parceler
@Parcelize
@TypeParceler<ExternalClass, ExternalClassParceler>()
class MyClass(val external: ExternalClass) // Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) // Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass)
最新文章
- 循序渐进做项目系列(5):制作安装包,谁人都可以!——VS制作安装包简明教程
- HTTPS那些事(一)HTTPS原理(转载)
- https 页面中引入 http 资源的解决方式
- Win10系统Start Menu上的图标莫名消失
- JavaScript开发规范要求
- OpenGL的gluPerspective和gluLookAt的关系[转]
- springMVC导出 CSV案例
- JavaScript之放大镜效果
- C++四种强制类型转换关键字
- (极简)linux安装QT4.7.3
- 隐藏AutoCompleteTextView下拉框的滚动条
- RealThinClient学习(一)
- 1.1 selenium 安装
- 20170310 - Python 3 下 SQLAlchemy 的 MySQL 数据库 URI 配置
- ROS-十步完成ROS-indigo安装
- CMD管道命令使用
- 使用android访问SQLServer数据库
- webGL之three.js入门3--材料篇
- LCTF wp简单复现
- Python入门编程中的变量、字符串以及数据类型