Android 可在 Kotlin 中打包
Android Parcelable in Kotlin
我有这样的 Java 可打包:
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public KwerendaGraficzna createFromParcel(Parcel in) {
return new KwerendaGraficzna(in);
}
public KwerendaGraficzna[] newArray(int size) {
return new KwerendaGraficzna[size];
}
};
现在尝试在 Kotlin 中实现它:
companion object {
@SuppressWarnings("rawtypes")
val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna!> {
return arrayOfNulls<KwerendaGraficzna!>(size)
}
}
}
arrayOfNulls
不会编译要求 KwerendaGraficzna
虽然它声称它收到 KwerendaGraficzna?
那我该怎么做呢?
我怀疑您使用的是过时版本的 Kotlin 编译器(因为您使用的是 !
)。这是使用最新版本正确编译的版本:
companion object {
@JvmField
val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna?> {
return arrayOfNulls(size)
}
}
}
由于 Parcelable.Creator
需要一个 public 静态字段,我们需要将 CREATOR
属性 标记为 @JvmField
and JvmStatic
。
您不需要实现所有样板代码。
相反,
@Parcelize
data class KwerendaGraficzna(val a: Int, val b: String): Parcelable{
// TODO: others code
}
就是这样。
您需要在build.gradle
中启用experimental
到true
才能应用上述方法。
android{
compileSdkVersion 30
defaultConfig{
applicationId "com.example"
minSdkVersion 25
targetSdkVersion 30
...
}
...
androidExtensions {
experimental = true
}
}
我有这样的 Java 可打包:
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public KwerendaGraficzna createFromParcel(Parcel in) {
return new KwerendaGraficzna(in);
}
public KwerendaGraficzna[] newArray(int size) {
return new KwerendaGraficzna[size];
}
};
现在尝试在 Kotlin 中实现它:
companion object {
@SuppressWarnings("rawtypes")
val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna!> {
return arrayOfNulls<KwerendaGraficzna!>(size)
}
}
}
arrayOfNulls
不会编译要求 KwerendaGraficzna
虽然它声称它收到 KwerendaGraficzna?
那我该怎么做呢?
我怀疑您使用的是过时版本的 Kotlin 编译器(因为您使用的是 !
)。这是使用最新版本正确编译的版本:
companion object {
@JvmField
val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna?> {
return arrayOfNulls(size)
}
}
}
由于 Parcelable.Creator
需要一个 public 静态字段,我们需要将 CREATOR
属性 标记为 @JvmField
and JvmStatic
。
您不需要实现所有样板代码。
相反,
@Parcelize
data class KwerendaGraficzna(val a: Int, val b: String): Parcelable{
// TODO: others code
}
就是这样。
您需要在build.gradle
中启用experimental
到true
才能应用上述方法。
android{
compileSdkVersion 30
defaultConfig{
applicationId "com.example"
minSdkVersion 25
targetSdkVersion 30
...
}
...
androidExtensions {
experimental = true
}
}