将对象作为参数从活动传递到片段的问题

时间:2018-03-06 13:54:52

标签: android android-fragments android-activity kotlin

我正在尝试将对象作为参数从活动传递给片段。

我已经搜索过山丘和山谷以了解如何做到这一点,我尝试了很多方法,但没有一种方法有效。

以下是我的尝试:

// In my Activity, where I call my fragment
var bundle = Bundle()
bundle.putParcelable("restaurant", restaurant)
var fragment = Home2Fragment()
fragment.arguments = bundle
supportFragmentManager.beginTransaction().replace(R.id.content, fragment, FRAGMENT_HOME).commit()

我的IDE(Android Studio)在bundle.putParcelable行中强调“restaurant”,告诉我类型不匹配。 这与getArguments()方法相同,我得到类型不匹配。

我的班级看起来像这样:

@Parcel
class Establishment {

    var title = ""
    // More variables

    fun loadFromJson(json: JsonObject) {
        title = readString(json, TAG_TITLE)
        // More API loads
    }

    companion object {
        private const val TAG_TITLE = "title"
        // More tags
    }
}

我不明白为什么我的班级被设置为“Parcel”但未被识别为“Parcelable”。

我正在寻找一种将参数从活动传递到片段的有效方法。

提前多多感谢。

编辑:

根据要求,我尝试将其设为Serializable。 我无法使其成为Serializable,因为“Serializable”不存在。

但我尝试将其设为“SerializedName”,但“此注释不适用于目标'类'”

2 个答案:

答案 0 :(得分:3)

你的班级应该以这种方式实现Parcelable:

class Establishment(val title: String) : Parcelable {

    private constructor(p: Parcel) : this(
        title = p.readString(),

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeString(title)
    }

    override fun describeContents() = 0

    companion object {
        @JvmField val CREATOR = object : Parcelable.Creator<Establishment> {
            override fun createFromParcel(parcel: Parcel) = Establishment(parcel)
            override fun newArray(size: Int) = arrayOfNulls<Establishment>(size)
        }
    }

    fun loadFromJson(json: JsonObject) {
        title = readString(json, TAG_TITLE)
        // More API loads
    }
}

答案 1 :(得分:0)

所以在你的帮助下我终于找到了如何做到这一点。

在我的片段中,我修改了newInstance()的乐趣:

companion object {
    fun newInstance(restaurant : Establishment) : Home2Fragment {
        val fragment = Home2Fragment()
        val args = Bundle()

        args.putParcelable("restaurant", restaurant)
        fragment.arguments = args

        return (fragment)
    }
}

这不是很难,因为我的IDE告诉我我的对象&#34; Establishment&#34;不是Parcelable对象。

所以真正的问题是设置&#34;建立&#34;作为一个可分割的对象。

这给了我很多时间,所以我决定使用Parcelable Generator插件,正如TpoM6oH所建议的那样。

我的班级现在看起来像这样:

@Parcel
class Establishment() : Parcelable {

    var title = ""
    // More var

    fun CREATOR(): Parcelable.Creator<Establishment> = object : Parcelable.Creator<Establishment> {
        override fun createFromParcel(p0: android.os.Parcel?): Establishment {
            return Establishment()
        }

        override fun newArray(p0: Int): Array<Establishment> {
            return null as Array<Establishment>
        }
    }

    constructor(parcel: android.os.Parcel) : this() {
        this = parcel.readString()
        // More var
    }

    fun loadFromJson(json: JsonObject) {
        title = readString(json, TAG_TITLE)
        // More load from API
    }

    companion object {
        private const val TAG_TITLE = "title"
    }

    override fun writeToParcel(parcel: android.os.Parcel, flags: Int) {
        parcel.writeString(title)
        // More var
    }

    override fun describeContents() : Int {
        return 0
    }
}

插件Parcelable Generator在我的班级中添加了一些神秘的功能,并且#34; Establishment&#34; (第2行)在我的IDE意见中仍然存在问题(&#34;此类实现了Parcelable,但没有提供CREATOR字段&#34;)。

但代码已经编译了!它正在发挥作用!

感谢大家的建议。