Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将对象作为参数从活动传递到片段的问题_Android_Android Fragments_Android Activity_Kotlin - Fatal编程技术网

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,但不提供创建者字段”)

但是代码确实可以编译!而且可以工作


谢谢大家的建议。

试着让它序列化。另外,你可以使用一个能生成所有代码的插件。是的,最好使用那些能删除样板代码生成的插件。