2017-07-28 13 views
7

Mam niestandardowy widok napisany w Kotlin za pomocą JvmOverloads, że mogę mieć wartość domyślną.Konstruktor widoku niestandardowego w Androidzie 4.4 rozbija się na Kotlin, jak go naprawić?

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

Wszystkie działa dobrze na Androidzie 5.1 i nowszych.

Jednak ulega awarii w 4.4, ponieważ konstruktor w 4.4 nie ma defStyleRes. Jak mogłem mieć to obsługiwane, że w 5.1 i wyżej mogłem mieć defStyleRes, ale nie w 4.4, bez potrzeby jawnego posiadania 4 konstruktorów zdefiniowanych jak my w Javie?

Uwaga: Poniższy kod działa poprawnie w wersji 4.4, ale wtedy tracimy wartość defStyleRes.

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

Odpowiedz

6

Najlepszym sposobem jest mieć swoją klasę w ten sposób.

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

To powrót do starego sposobu posiadające wszystkie 4 konstruktorzy zdefiniowane :( – Elye

+0

No to droga Android działa, bez względu na to jak składnia znacznie Kotlin pomaga, to Android ten, który wymaga boilerplate: D Tak czy inaczej, można przycinać te przy użyciu domyślnych wartości, ale musisz użyć co najmniej 2 konstruktorów – Seaskyways

+0

@ Elye Edytowałem swoją odpowiedź, aby pokazać tę samą funkcjonalność z 2 konstruktorami. – Seaskyways

4

Mam sposób na zrobienie tego. Po prostu przeładuj pierwsze 3 funkcje, zostaw czwartą dla Lollipopa i powyżej z @ 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

To jest poprawna odpowiedź. Dobry @Elye –

Powiązane problemy