我有我的可分类的文章:
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<Article> = object : Parcelable.Creator<Article> {
override fun createFromParcel(parcel: Parcel): Article = Article(parcel)
override fun newArray(size: Int): Array<Article?> = arrayOfNulls(size)
}
}
}
但是我的班级在编写图像var时遇到类型不匹配。它期待长而不长?我明白如果我做这样的事情就可以解决这个问题:
dest.writeLong(image!!)
但问题是这个var在我的上下文中确实可以为null。 我不想要将我的图像var定义为默认值,如0.我真的希望var保持可为空。
有没有办法写一个可以为空的var?
答案 0 :(得分:2)
在Kotlin中,您必须处理Kotlin的原始类型的空案例,它们是Java中的 objects (Long
而不是long
) 。您可以将以下逻辑应用于任何此类型。
private fun writeNullableLongToParcel(l: Long?): Long = when(l) {
null -> -1
else -> l
}
对于Boolean
,您可以执行以下操作:
private fun writeBooleanToParcel(bool: Boolean?): Int = when(bool) {
true -> 1
false -> 0
else -> -1
}
将这些内容添加到您的Parcelable
数据类,并在writeToParcel
parcel?.writeLong(writeNullableLongToParcel(myLong))
答案 1 :(得分:1)
在Java中,我处理Long
(而不是long
)的方式是在Android源代码之后编写的,用于编写其他&#34; nullable&#34; types:你首先写一些标记值来表示null vs non 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。
答案 2 :(得分:0)
如果您的图片变量应保持可为空
parcel.readValue(Long::class.java.classLoader) as? Long
parcel.writeValue(image)
答案 3 :(得分:0)
如果不为null,则写入值,否则为默认值
longValue?.let { parcel.writeLong(it) }?:let{ parcel.writeLong(DEFAULT_VALUE)}