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.

  • ¿Cómo get la class Java del param del método genérico?
  • Cómo degradar Kotlin en Intellij 15
  • Anulando un método varargs Java @Nullable en Kotlin, IDE se queja de que no anula nada
  • cómo hacer una connection selectiva con la api de Google Drive (Android)
  • La combinación de cuadros de OpenCV solo da como resultado azul
  • ¿Por qué la class pública no puede extender la class privada?
  • Enlace de datos de Android en el submodule
  • ¿Cómo puedo usar un método Java String (split) directamente desde la fuente de Kotlin?
  • ¿El module Plain Kotlin en Android Studio 3.0, `api` no es compatible?
  • Dagger 2 Named no se puede proporcionar sin un método @Provides
  • Android Studio salta sobre puntos de interrupción