我正在尝试将对象作为参数从活动传递给片段。
我已经搜索过山丘和山谷以了解如何做到这一点,我尝试了很多方法,但没有一种方法有效。
以下是我的尝试:
// 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”,但“此注释不适用于目标'类'”
答案 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;)。
但代码已经编译了!它正在发挥作用!
感谢大家的建议。