我有一个使用JvmOverloads在Kotlin中编写的自定义视图,我可以使用默认值。
class MyView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
defStyleRes: Int = 0
) : LinearLayout(context, attrs, defStyle, defStyleRes)
在Android 5.1及更高版本中一切正常。
然而,它在4.4中崩溃,因为4.4中的构造函数没有defStyleRes
。我怎么能支持在5.1及以上版本中我可以拥有defStyleRes
而不是4.4,而不需要像在Java中那样明确地定义4个构造函数?
注意:以下内容在4.4中可以正常工作,但我们会松开defStyleRes
。
class MyView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : LinearLayout(context, attrs, defStyle)
答案 0 :(得分:9)
最好的方法是让你的课程这样。
class MyView : LinearLayout {
@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr)
@TargetApi(Build.VERSION_CODES.LOLLIPOP) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
}
答案 1 :(得分:6)
我有办法这样做。只需重载前3个函数就可以了,留下第4个用于Lollipop以及上面用@TargetApi包装。
class MyView : LinearLayout {
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: super(context, attrs, defStyleAttr)
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int)
: super(context, attrs, defStyleAttr, defStyleRes)
}
答案 2 :(得分:1)
只需定义如下构造函数:
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
@TargetApi(21)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)