Android parcelable – 写入可以为空
我有我的parcelable课文章:
class Article : Parcelable { var image: Long? = null var category: String? = null var videos: String? = null constructor(data: JSONObject) { if (condition) image = 50000L category = data.getString("category") videos = data.getString("videos") } private constructor(parcel: Parcel) { image = parcel.readLong() category = parcel.readString() videos = parcel.readString() } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeLong(image) // error here dest.writeString(category) dest.writeString(videos) } override fun describeContents(): Int = 0 companion object { @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): Article = Article(parcel) override fun newArray(size: Int): Array = arrayOfNulls(size) } } }
但是我的类在编写图像var时出现types不匹配。 它期待一个长而不长的? 我明白,如果我这样做可以解决这个问题:
dest.writeLong(image!!)
但问题是这个var在我的上下文中可能真的是空的。 我不希望将我的图像var定义为像0这样的默认值。我真的希望var保持空值。
有没有办法写一个可空的var?
在Java中,我们处理Long
(而不是long
)的方式是在Android源代码之后编写的,用于编写其他“可空”types:您首先编写某种标记值来指示null与非null,然后有条件地写真正的价值。
private static final int NULL_ELEMENT_FLAG = 0; private static final int NONNULL_ELEMENT_FLAG = 1; public static void writeLong(Parcel dest, Long l) { if (l != null) { dest.writeInt(NONNULL_ELEMENT_FLAG); dest.writeLong(l); } else { dest.writeInt(NULL_ELEMENT_FLAG); } } public static Long readLong(Parcel in) { if (in.readInt() != NULL_ELEMENT_FLAG) { return in.readLong(); } else { return null; } }
希望你能适应这kotlin。