Android 将对象作为参数从活动传递到片段的问题
我试图将对象作为参数从活动传递到片段 我已经翻山越岭地寻找如何做到这一点,我尝试了许多方法,但没有一种有效 以下是我尝试过的:Android 将对象作为参数从活动传递到片段的问题,android,android-fragments,android-activity,kotlin,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 supportFragmen
// 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
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
}
}
我不明白为什么我的类被设置为“包裹”,但没有被识别为“包裹”
我正在寻找一种将参数从活动传递到片段的有效方法
先谢谢你
编辑: 正如我所问的,我试图使它成为可序列化的。 我无法将其序列化,因为“Serializable”不存在
但我尝试将其设置为“SerializedName”,但“此注释不适用于目标‘类’”您的类应该以这种方式实现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
}
}
类建立(val标题:字符串):可包裹{
私有构造函数(p:Parcel):这个(
title=p.readString(),
覆盖包裹(目的地:包裹,标志:整型){
目的地书面限制(标题)
}
重写有趣的描述内容()=0
伴星{
@JvmField val CREATOR=对象:Parcelable.CREATOR{
覆盖createFromParcel(地块:地块)=建筑物(地块)
覆盖新数组(大小:Int)=arrayOfNulls(大小)
}
}
趣味loadFromJson(json:JsonObject){
title=readString(json,TAG_title)
//更多API加载
}
}
在你的帮助下,我终于找到了解决方法
在我的片段中,我修改了我的newInstance():
这并不是很困难,因为我的IDE告诉我我的对象“建立”不是一个可包裹的对象
因此,真正的问题是将“机构”设置为可包裹的对象
这给了我很多时间,所以我决定使用TpoM6oH建议的Parcelable Generator插件
我的班级结构现在是这样的:
@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
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
}
}
@包裹
类建立():可包裹{
var title=“”
//更多变量
乐趣创建者():Parcelable.CREATOR=对象:Parcelable.CREATOR{
覆盖乐趣createFromParcel(p0:android.os.Parcel?):建立{
返回机构()
}
覆盖新数组(p0:Int):数组{
以数组形式返回null
}
}
构造函数(parcel:android.os.parcel):this(){
this=parcel.readString()
//更多变量
}
趣味loadFromJson(json:JsonObject){
title=readString(json,TAG_title)
//来自API的更多负载
}
伴星{
私有const val TAG_TITLE=“TITLE”
}
覆盖fun writeToParcel(parcel:android.os.parcel,标志:Int){
包裹。书面记录(标题)
//更多变量
}
覆盖有趣的描述内容():Int{
返回0
}
}
plugin Parcelable Generator在我的类中添加了一些神秘的函数,“建立”(第2行)在我的IDE看来仍然是个问题(“这个类实现了Parcelable,但不提供创建者字段”)
但是代码确实可以编译!而且可以工作
谢谢大家的建议。试着让它序列化。另外,你可以使用一个能生成所有代码的插件。是的,最好使用那些能删除样板代码生成的插件。