Android parcelable - 写nullable long

时间:2018-01-10 18:57:43

标签: android kotlin nullable parcelable type-mismatch

我有我的可分类的文章:

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?

4 个答案:

答案 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)}