gpt4 book ai didi

android - 如何使用 Kotlin 创建自定义 View 的构造函数

转载 作者:IT老高 更新时间:2023-10-28 13:26:49 70 4
gpt4 key购买 nike

我正在尝试在我的 Android 项目中使用 Kotlin。我需要创建自定义 View 类。每个自定义 View 都有两个重要的构造函数:

public class MyView extends View {
public MyView(Context context) {
super(context);
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}

MyView(Context) 用于在代码中实例化 View ,MyView(Context, AttributeSet) 在从 XML 膨胀布局时被布局膨胀器调用。

回答 this question建议我使用具有默认值或工厂方法的构造函数。但这就是我们所拥有的:

工厂方法:

fun MyView(c: Context) = MyView(c, attrs) //attrs is nowhere to get
class MyView(c: Context, attrs: AttributeSet) : View(c, attrs) { ... }

fun MyView(c: Context, attrs: AttributeSet) = MyView(c) //no way to pass attrs.
//layout inflater can't use
//factory methods
class MyView(c: Context) : View(c) { ... }

具有默认值的构造函数:

class MyView(c: Context, attrs: AttributeSet? = null) : View(c, attrs) { ... }
//here compiler complains that
//"None of the following functions can be called with the arguments supplied."
//because I specify AttributeSet as nullable, which it can't be.
//Anyway, View(Context,null) is not equivalent to View(Context,AttributeSet)

如何解决这个难题?


UPDATE: 好像我们可以使用 View(Context, null) 父类(super class)构造函数而不是 View(Context),所以工厂方法方法似乎是解决方案。但即使那样我也无法让我的代码工作:

fun MyView(c: Context) = MyView(c, null) //compilation error here, attrs can't be null
class MyView(c: Context, attrs: AttributeSet) : View(c, attrs) { ... }

fun MyView(c: Context) = MyView(c, null) 
class MyView(c: Context, attrs: AttributeSet?) : View(c, attrs) { ... }
//compilation error: "None of the following functions can be called with
//the arguments supplied." attrs in superclass constructor is non-null

最佳答案

自 2015 年 3 月 19 日发布的 M11 以来,Kotlin 支持多个构造函数。语法如下:

class MyView : View {
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
// ...
}

constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) {}
}

更多信息 herehere .

编辑:您还可以使用@JvmOverloads 注解,以便 Kotlin 自动为您生成所需的构造函数:

class MyView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : View(context, attrs, defStyle)

但请注意,因为这种方法有时可能会导致意外结果,具体取决于您继承的类如何定义其构造函数。 that article 中对可能发生的情况给出了很好的解释。 .

关于android - 如何使用 Kotlin 创建自定义 View 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670828/

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