У меня есть приложение Android, написанное на Kotlin с классом BaseKeyListener
, расширяющим DigitsKeyListener
. Моя минимальная версия SDK 21
. В настоящее время класс вызывает устаревший конструктор. Однако новый конструктор доступен только с уровня API 26 и выше. Как бы я назвал конструктор условно на основе уровня API?
Я в основном отправил ту же проблему некоторое время go для Android, но решение, похоже, не работает в Kotlin.
В Kotlin мой класс теперь выглядит следующим образом:
// primary constructor 'DigitsKeyListener' shows lint warning about deprecation.
abstract class BaseKeyListener() : DigitsKeyListener() {
}
Если я применяю решение для вопроса Android, я получаю этот код:
abstract class BaseKeyListener : DigitsKeyListener {
// still results in deprecation warning
constructor() : super()
}
Было также предоставлено альтернативное решение, если бы мне пришлось сделать конструкторы частными и реализовать шаблон newInstance. Однако я не могу использовать это решение, потому что есть другие классы, которые наследуются от BaseKeyListener, и BaseKeyListener также является абстрактным.
Единственное, о чем я могу думать, это:
abstract class BaseKeyListener : DigitsKeyListener {
constructor()
@RequiresApi(Build.VERSION_CODES.O)
constructor(locale: Locale) : super(locale)
}
Но в результате я должен был бы определить два конструктора для каждого подкласса. И если бы я использовал класс, мне пришлось бы добавлять условие каждый раз, когда используемый нами языковой стандарт одинаков.
Неудачный результат:
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()
Идеальным решением должно быть назначение AmountKeyListener в одной строке и BaseKeyListener должны знать, когда использовать нашу пользовательскую локаль 'MY_LOCALE'
editText.keyListener = KeyListenerUtil.AmountKeyListener()
Как решить эту проблему?