Kotlin con Android: classs base y extensiones de Kotlin para Android

Así que he usado Kotlin Android Extensions y me resulta muy fácil de usar y bien valer la pena. No más findViewById o Butterknife.Bind(...) . No he encontrado ningún problema con todo, excepto por una situación.

En una class base, por ejemplo, BaseActivity , normalmente hay un montón de vistas que estarán presentes en todos los layouts, por ejemplo, una barra de herramientas. Y operaciones comunes como changeToolbarColor() , o setToolbarTitle() .

En estos casos simples, no puedo usar Kotlin Android Extensions porque, como es una class base, la vista en sí misma estará presente en múltiples layouts y no puede ser propiedad importada. En este caso, simplemente uso by lazy {find<>(...) .

¿Hay alguna manera de que esto se pueda lograr con el complemento de extensión android incorporado?

Kotlin Android Extensions genera una function de extensión para cada elemento en un layout determinado. Debido a que los methods de extensión existen fuera del model de inheritance, no hay forma de definir un protocolo común como abstract val toolbar:Toolbar de abstract val toolbar:Toolbar en el elemento primario.

Sin embargo, bajo el capó los methods de extensión solo ejecutan findById , si el ID dado existe en un layout, obtendrá el elemento. Esto significa que si mantiene los mismos identificadores para sus elementos comunes dentro de sus layouts (es decir, todas las barras de herramientas con @id/toolbar ), puede crear un layout ficticio con sus elementos comunes y sus respectivos ID. Este layout funcionará como una especie de interfaz, lo que le permitirá import kotlinx.android.synthetic.main.base_activity_dummy.* Y así generar los methods de extensión que desee.

Al hacer lo anterior, this.toolbar en su BaseActivity obtendrá el elemento real en su actividad concreta en lugar del elemento en el layout ficticio.

Por supuesto, esta técnica, aunque conveniente, es propensa a errores y podría hacer que su progtwig sea muy confuso para un extraño. Pero nuevamente, no será más propenso a errores que llamar a findById todas partes.

  • Kotlin's Iterable y Sequence se ven exactamente igual. ¿Por qué se requieren dos types?
  • ¿Por qué los inicializadores de propiedad no llaman un setter personalizado?
  • Kotlin: lambdas seguros (sin pérdida de memory)?
  • Publicar en el hilo de la interfaz de usuario
  • Lista que contiene valores anulables a una Lista anulable en Kotlin
  • ¿Cómo hacer que los constructores seguros de Kotlin trabajen en Scala?
  • Cómo convertir cadena a char en Kotlin?
  • Kotlin, JPA y @Transient
  • Referencia al setter de properties de la class Kotlin como function
  • ¿Cuál es la diferencia entre shouldbe y shouldbee exactamente en KotlinTest?
  • kotlin, ¿cómo simplificar pasar los parameters al constructor de la class base?