El constructor de vista personalizada en Android 4.4 se bloquea en Kotlin, ¿cómo arreglarlo?
Tengo una vista personalizada escrita en Kotlin usando JvmOverloads que podría tener valor por defecto.
class MyView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyle: Int = 0, defStyleRes: Int = 0 ) : LinearLayout(context, attrs, defStyle, defStyleRes)
Todo funciona bien en Android 5.1 o superior.
- ¿Cómo funciona la sintaxis de acceso a propiedades de Kotlin para las clases Java?
- Kotlin para Android. tostada
- ClassNotFoundException en el sabor personalizado con kotlin
- Vistas de Android personalizadas con Kotlin
- ¿Cómo interactúa Kotlin con Java y JavaScript?
Sin embargo, se bloquea en 4.4, ya que el constructor en 4.4 no tiene defStyleRes
. ¿Cómo podría tener que apoyado que en 5.1 y más arriba podría tener defStyleRes
pero no en 4.4, sin necesidad de tener explícitamente 4 constructores definidos como lo hicimos en Java?
Nota: El siguiente funciona bien en 4.4, pero luego se pierden los defStyleRes
.
class MyView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyle: Int = 0 ) : LinearLayout(context, attrs, defStyle)
- No es capaz de "findViewById" en Kotlin. Error de obtención "Inferencia de tipo no"
- La biblioteca de Kotlin 'classes.jar' tiene un formato no soportado. Actualice la biblioteca o el complemento
- Reglas de ProGuard para la reflexión de Kotlin
- Kotlin-android: enlace de datos de referencia no resuelto
- Soporte de transición de fragmentos 25.1.0 con Recyclerview
- Ordenar la colección por varios campos en Kotlin
- ¿Cómo realizar una solicitud de API en Kotlin?
- No se puede burlar la clase final de Kotlin usando Mockito 2
La mejor manera es tener a tu clase de esta manera.
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) }
Tengo una forma de hacerlo. Simplemente sobrecargue las 3 primeras funciones, deje la 4ta para Lollipop y encima de wrap con @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) }
- ¿Hay alguna manera de forzar que el menú de opciones se muestre en Android
- ¿Mostrar el cuadro de diálogo de Android encima de otro?