2017-07-28 29 views
7

我有一个使用JvmOverloads在Kotlin编写的自定义视图,我可以使用默认值。Android 4.4中的自定义视图构造函数在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,而不需要显式地有4个构造函数定义像我们在Java中所做的那样?

注意:下面的4.4会正常工作,但是我们放弃了defStyleRes

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

回答

6

最好的方法是让你的班级这样。

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) 
} 
+0

这回有定义的所有4个构造:( – Elye

+0

那么它就是这样的Android作品,不管多少科特林的语法如何帮助,这是Android的需要样板之一的老办法:d不管怎么说,你可以修剪这些使用默认值,但你必须使用至少2个构造函数 – Seaskyways

+0

@Elye我已编辑我的答案,以显示与2构造函数相同的功能 – Seaskyways

4

我有办法这样做。只是超载的前3个功能将做,离开第四个棒棒糖和以上包装@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) 
} 
+0

这是一个有效的答案。好@Elye –

相关问题