首页 文章

Android parcelable - 写nullable long

提问于
浏览
0

我有我的可分类的文章:

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

但我的 class 在编写图像var时遇到类型不匹配 . 它期待长而不长?我明白,如果我做这样的事情,这可以解决:

dest.writeLong(image!!)

但问题是这个var在我的上下文中可能真的是空的 . 我不希望将我的图像var定义为默认值,如0.我真的希望var保持可为空 .

有没有办法写一个可空的var?

3 回答

  • 1

    在Kotlin中,你必须处理原始类型的Kotlin的空案例,它们是Java中的对象( 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))
    
  • 0

    在Java中,我处理 Long (而不是 long )的方式在用于编写其他"nullable"类型的Android源代码之后被模式化:您首先编写某种标记值以指示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 .

  • 1

    如果您的图像变量应该可以为空

    parcel.readValue(Long::class.java.classLoader) as? Long

    parcel.writeValue(image)

相关问题