Android Kotlin llamar diferente y obsoleto constructor condicional

Wirling:

Tengo una aplicación para Android escrita en Kotlin con una clase BaseKeyListenerque se extiende DigitsKeyListener. Mi versión mínima del SDK es 21. La clase actualmente está llamando a un constructor en desuso. Sin embargo el nuevo constructor sólo está disponible desde el nivel del API 26 y hacia arriba. ¿Cómo iba a llamar al constructor condicional basada en el nivel API?

Yo, básicamente, publicado el mismo problema hace un tiempo para Android, pero la solución no parece que el trabajo en Kotlin.

En Kotlin mi clase ahora se ve así:

// primary constructor 'DigitsKeyListener' shows lint warning about deprecation.
abstract class BaseKeyListener() : DigitsKeyListener() {

}

Si aplico la solución para la cuestión Android consigo este código:

abstract class BaseKeyListener : DigitsKeyListener {

    // still results in deprecation warning
    constructor() : super()
}

Una solución alternativa también fue proporcionado eran que tenía que hacer que los constructores privados e implementar un patrón newInstance. Sin embargo no puedo usar esa solución, porque hay otras clases que heredan de la BaseKeyListener y la BaseKeyListener también es abstracto.

Lo único que se me ocurre es la siguiente:

abstract class BaseKeyListener : DigitsKeyListener {

   constructor()

    @RequiresApi(Build.VERSION_CODES.O)
   constructor(locale: Locale) : super(locale)
}

Pero como resultado que tendría que definir dos constructores para cada subclase. Y si yo utilizar la clase que tendría que añadir una condición cada vez que mientras que la configuración regional que se utiliza es el mismo.

desafortunado resultado:

open class AmountKeyListener : BaseKeyListener {

    constructor() : super()

    @RequiresApi(Build.VERSION_CODES.O)
    constructor(locale: Locale) : super(locale)
}

// usage of the keyListener
editText.keyListener = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) KeyListenerUtil.AmountKeyListener(
        MY_LOCALE) else KeyListenerUtil.AmountKeyListener()

La solución ideal debe ser para asignar el AmountKeyListener en una sola línea y la BaseKeyListener debe saber cuándo usar nuestra costumbre local 'MY_LOCALE'

editText.keyListener = KeyListenerUtil.AmountKeyListener()

¿Cómo resolver este problema?

Tenfour04:

La solución de Java se ha vinculado básicamente es simplemente ignorando la desaprobación y exclusivamente mediante el constructor en desuso. Creo que su última solución es la mejor. Su uso no es peor que si estuviera usando DigitsKeyListener directamente - you'd todavía tiene que tener el control de la versión del SDK.

Un pequeño problema que veo es que por encima de su primer constructor llama implícitamente al súper constructor vacío, y por lo tanto evita el aviso de desaprobación a través de lo que es esencialmente un corte del lenguaje. En realidad, esto me parece ser un error en el inspector de código de Kotlin. Creo que sería más apropiado llamar explícitamente al constructor super y también despreciar este constructor en su propia clase. Así que me gustaría que se vea como esto:

abstract class BaseKeyListener : DigitsKeyListener {

    @Suppress("DEPRECATION")
    @Deprecated("Use the constructor with a locale if on SDK 26+.")
    constructor(): super()

    @RequiresApi(Build.VERSION_CODES.O)
    constructor(locale: Locale) : super(locale)
}

Esto no cambia funcionalmente cómo funciona, pero sin desaprobación de su constructor al descubierto, se hace muy fácil de usar la versión obsoleta de DigitsKeyListener todas partes por accidente.

Y en el lugar de uso, aunque dolorosa, que se vería como lo tienes arriba, excepto que también pondría @Suppress("DEPRECATION")justo antes de esa línea para confirmar la advertencia desaprobación.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=339698&siteId=1
Recomendado
Clasificación