Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 &引用;Parcelable协议需要一个名为Creator的Parcelable.Creator对象;(我有创造者)-在科特林_Android_Kotlin_Parcelable_Parcel_Companion Object - Fatal编程技术网

Android &引用;Parcelable协议需要一个名为Creator的Parcelable.Creator对象;(我有创造者)-在科特林

Android &引用;Parcelable协议需要一个名为Creator的Parcelable.Creator对象;(我有创造者)-在科特林,android,kotlin,parcelable,parcel,companion-object,Android,Kotlin,Parcelable,Parcel,Companion Object,我收到错误消息“Parcelable protocol需要一个名为Creator on class…..的Parcelable.Creator对象”,但我确实有一个Creator,我不知道它有什么问题。我从中复制了它,并更改了类名以适合我的代码。 我怀疑从Java到Kotlin的(自动)转换不是完美的(或者准确地说:是否与需要的转换略有不同),但我不知道到底是什么问题 有一个线程具有相同的错误消息(),但问题在于 “fun writeToParcel”的写入顺序与在“fun DataHandle

我收到错误消息“Parcelable protocol需要一个名为Creator on class…..的Parcelable.Creator对象”,但我确实有一个Creator,我不知道它有什么问题。我从中复制了它,并更改了类名以适合我的代码。 我怀疑从Java到Kotlin的(自动)转换不是完美的(或者准确地说:是否与需要的转换略有不同),但我不知道到底是什么问题

有一个线程具有相同的错误消息(),但问题在于 “fun writeToParcel”的写入顺序与在“fun DataHandler”中读取的顺序不同。这不是我的问题,因为顺序是一样的

另一个答案指出,函数需要是静态的,这可能是一个问题。但是,Kotlin没有“静态”功能。我读到它是用“伴星对象”完成的。我试过了(见下文),但它抛出了另一个错误——我不确定它是否会起作用

class DataHandler : Parcelable {

    var player1name = ""
    var player1color = 0

    //main constructor
    fun DataHandler(player1name: String, player1color: Int) {
        this.player1name = player1name
        this.player1color = player1color
    }


    //write object values to parcel for storage
    override fun writeToParcel(dest: Parcel, flags: Int) {
        //write all properties to the parcle
        dest.writeString(player1name)
        dest.writeInt(player1color)
    }

    //constructor used for parcel
    fun DataHandler(parcel: Parcel) {
        //read and set saved values from parcel
        player1name = parcel.readString()
        player1color = parcel.readInt()
    }

    //creator - used when un-parceling our parcle (creating the object)
    val CREATOR: Parcelable.Creator<DataHandler> = object : Parcelable.Creator<DataHandler> {

        override fun createFromParcel(parcel: Parcel): DataHandler {
            return DataHandler(parcel) as DataHandler
        }

        override fun newArray(size: Int): Array<DataHandler?> {
            return arrayOfNulls<DataHandler>(size)
        }
    }

    //return hashcode of object
    override fun describeContents(): Int {
        return hashCode()
    }
}
这是接收活动:

        val intentPickPlayer = Intent(this, PlayGame::class.java)

        var dataHandler = DataHandler()
        dataHandler.player1name = "testing"
        intentPickPlayer.putExtra("data", dataHandler)

        startActivity(intentPickPlayer)
class PlayGame : Activity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.playgame)

    val test = intent.getParcelableExtra<DataHandler>("data")

    Toast.makeText(this, test.player1name, Toast.LENGTH_SHORT).show()

}
班级游戏:活动(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.playgame)
val测试=intent.getParcelableExtra(“数据”)
Toast.makeText(this,test.player1name,Toast.LENGTH\u SHORT.show())
}
如上所述:我试图通过将CREATOR放入一个伴生对象中使其保持静态(显然这是Kotlin中的工作方式,但这会产生另一个错误(我不确定它是否修复了第一个问题)

伴生对象{
//创建者-取消包裹时使用(创建对象)
val创建者:Parcelable.CREATOR=对象:Parcelable.CREATOR{
覆盖createFromParcel(地块:地块):DataHandler{
//这里出现了一个错误:parcel有一个红色下划线,上面写着:“公共构造函数DataHandler()的参数太多了。”
将DataHandler(包裹)返回为DataHandler
}
覆盖新数组(大小:Int):数组{
返回阵列fnulls(大小)
}
}

在Kotlin中,构造函数由
构造函数
关键字定义-

有关辅助构造函数的信息,请参见。辅助构造函数需要委托给主构造函数

默认构造函数通常在类名和作为其一部分定义的属性之后定义:

class DataHandler(var player1name: String, var player1color: Int) : Parcelable { //write object values to parcel for storage override fun writeToParcel(dest: Parcel, flags: Int) { //write all properties to the parcle dest.writeString(player1name) dest.writeInt(player1color) } //constructor used for parcel constructor(parcel: Parcel) : this( //read and set saved values from parcel player1name = parcel.readString(), player1color = parcel.readInt()) companion object { @JvmField //creator - used when un-parceling our parcle (creating the object) val CREATOR: Parcelable.Creator = object : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): DataHandler { return DataHandler(parcel) as DataHandler } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } //return hashcode of object override fun describeContents(): Int { return hashCode() } } 类DataHandler(变量player1name:String,变量player1color:Int):可包裹{ //将对象值写入地块以进行存储 覆盖包裹(目的地:包裹,标志:整型){ //将所有属性写入地块 目标写入字符串(player1name) 目标写入(播放器1颜色) } //用于包裹的构造函数 构造函数(地块:地块):此( //从地块读取并设置保存的值 player1name=parcel.readString(), player1color=parcel.readInt()) 伴星{ @JvmField //创建者-取消包裹时使用(创建对象) val创建者:Parcelable.CREATOR=对象:Parcelable.CREATOR{ 覆盖createFromParcel(地块:地块):DataHandler{ 将DataHandler(包裹)返回为DataHandler } 覆盖新数组(大小:Int):数组{ 返回阵列fnulls(大小) } } } //返回对象的哈希代码 覆盖有趣的描述内容():Int{ 返回hashCode() } }
您能否尝试
同伴对象创建者:…
?两者都不是:同伴对象创建者:Parcelable.CREATOR=对象:Parcelable.CREATOR{[fun createFromParcel and fun newArray]}也不是同伴对象创建者:…{val CREATOR:Parcelable.CREATOR=对象:Parcelable.CREATOR{[fun createFromParcel and fun newArray]}worksThis:companion object CREATOR:Parcelable.CREATOR{[fun createFromParcel and fun newArray]}看起来更好,但在fun createFromParcel中,返回语句中的“parcel”用红色下划线(消息:“公共构造函数DataHandler的参数太多”“-我不知道为什么,因为同一个代码不在伴随对象中时没有下划线)您必须用
@JvmField
标记
创建者
。 class DataHandler(var player1name: String, var player1color: Int) : Parcelable { //write object values to parcel for storage override fun writeToParcel(dest: Parcel, flags: Int) { //write all properties to the parcle dest.writeString(player1name) dest.writeInt(player1color) } //constructor used for parcel constructor(parcel: Parcel) : this( //read and set saved values from parcel player1name = parcel.readString(), player1color = parcel.readInt()) companion object { @JvmField //creator - used when un-parceling our parcle (creating the object) val CREATOR: Parcelable.Creator = object : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): DataHandler { return DataHandler(parcel) as DataHandler } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } //return hashcode of object override fun describeContents(): Int { return hashCode() } }