Android &引用;Parcelable协议需要一个名为Creator的Parcelable.Creator对象;(我有创造者)-在科特林
我收到错误消息“Parcelable protocol需要一个名为Creator on class…..的Parcelable.Creator对象”,但我确实有一个Creator,我不知道它有什么问题。我从中复制了它,并更改了类名以适合我的代码。 我怀疑从Java到Kotlin的(自动)转换不是完美的(或者准确地说:是否与需要的转换略有不同),但我不知道到底是什么问题 有一个线程具有相同的错误消息(),但问题在于 “fun writeToParcel”的写入顺序与在“fun DataHandler”中读取的顺序不同。这不是我的问题,因为顺序是一样的 另一个答案指出,函数需要是静态的,这可能是一个问题。但是,Kotlin没有“静态”功能。我读到它是用“伴星对象”完成的。我试过了(见下文),但它抛出了另一个错误——我不确定它是否会起作用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
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()
}
}