gpt4 book ai didi

android - 构造函数在 kotlin 派生类中采用 Parcelable 构造函数

转载 作者:行者123 更新时间:2023-11-30 00:24:51 24 4
gpt4 key购买 nike

这是对 question 的跟进我之前问过。我正在使用来自 https://github.com/nekocode/android-parcelable-intellij-plugin-kotlin 的 Android Parcelable 插件按照 bennyl 的建议,我将构造函数的生成代码更改为

class ChessClock(context:Context) : TextView(context), Parcelable {
lateinit var player:String
constructor(context:Context, p:String, angle:Float) : this(context) {
player = p
rotation = angle
}
}

这消除了我询问过的语法错误。我现在遇到了另一个我一开始忽略的问题。

插件为 writeToParcel 生成了这段代码:

override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(player)
parcel.writeFloat(rotation)
parcel.writeLong(mTime)
parcel.writeInt(mState)
}

和这个构造函数:

constructor(parcel: Parcel) :this() {
player = parcel.readString()
rotation = parcel.readFloat()
mTime = parcel.readLong()
mState = parcel.readInt()
}

(其实我加了旋转的线条,不过这不重要。)

现在,构造函数不会编译。 this 带有下划线,我看到了工具提示 enter image description here我希望看到类似的东西,

constructor(parcel: Parcel) :this(context, parcel.readString(), parcel.readFloat()) {
mTime = parcel.readLong()
mState = parcel.readInt()
}

但如果我尝试这样做,我会收到消息,“在调用父类(super class)构造函数之前无法访问上下文。”我对 kotlin(和 android)很陌生,我不明白这里发生了什么。我试过调用 super,但它告诉我需要调用主构造函数。我也试过调用 TextView() 但它告诉我需要调用 thissuper

我没有看到有一种方法可以将上下文写入包裹,(我不确定这意味着什么。)

你能告诉我应该如何修改代码,更重要的是,你能解释为什么吗?

最佳答案

需要提供

context 才能调用 this(context,...) 构造函数。但是,您不能将 constructor(parcel: Parcel) 更改为 constructor(context: Context, parcel: Parcel) 因为 Parcelable 需要`constructor(parcel: Parcel)

这是怎么回事?您的类派生自 TextView,它需要一个 Context 来实例化。您的主要构造函数正在执行此操作...

class ChessClock(context: Context) : TextView(context) ...

文档说...

If the class has a primary constructor, the base type can (and must) be initialized right there, using the parameters of the primary constructor.

由于您已选择使用主构造函数,因此基类必须由该构造函数初始化,并且辅助构造函数与主构造函数链接。

    constructor(context:Context, p:String, angle:Float) : this(context) ...
// notice how the secondary constructor has the context with which to
// call the primary constructor

您看到的错误是由于第二个辅助构造函数没有为其调用的构造函数提供上下文(它正在调用第一个辅助构造函数)。

    constructor(parcel: Parcel) :this(context, parcel.readString(), parcel.readFloat()) ...
// compiler error because "context" has no source, there is no
// parameter "context" being supplied

更重要的Parcel构造器是Parcelable插件工具在继承Parcelable接口(interface)时添加的(see the example of a Parcelable implementation) .因此,CREATOR 方法(所需的 Parcelable.Creator 接口(interface))期望找到一个仅采用 Parcel 的构造函数。您可能需要调整您的设计,因为 Context 不可序列化,因此不应(不能)放置在 Parcel 中。您可以查看 CREATOR 代码并了解如何修改它,但我建议更改设计。

“最佳实践”是将业务逻辑与 UI 逻辑分开。在这里,您已将 ChessClock 绑定(bind)到 UI 对象 TextView。 “ChessClock”对我来说听起来像 UI,所以也许您需要一个 ChessClockData 类作为 Parcelable 而不是 Clock UI 传递。

关于android - 构造函数在 kotlin 派生类中采用 Parcelable 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45578982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com