Solución:
Repasemos los dos.
Configuración
Extensiones de Android Kotlin
- Importe extensiones sintéticas de diseño adecuadas:
import kotlinx.android.synthetic.main.
.* - Vistas de referencia en código a través de sus identificadores:
textView.text = "Hello, world!"
. Estas extensiones funcionan en:Activities
,Fragments
yViews
.
Ver encuadernación
- Cree una referencia vinculante dentro de su clase:
private lateinit var binding
YourClassBinding - Infle su encuadernación
binding = YourClassBinding.inflate(layoutInflater)
dentroActivity
‘sonCreate
y llamasetContentView(binding.root)
o inflarlo enFragment
‘sonCreateView
luego devuélvelo:return binding.root
- Vistas de referencia en el código a través del enlace usando sus identificadores
binding.textView.text = "Hello, world!"
Tipo de seguridad
Extensiones de Android Kotlin y ViewBinding son seguros para los tipos por definición, porque las vistas referenciadas ya están convertidas en los tipos adecuados.
Seguridad nula
Extensiones de Android Kotlin y ViewBinding son ambos null a salvo. ViewBinding no tiene ninguna ventaja aquí. En caso de KAE, si la vista está presente solo en algunas configuraciones de diseño, IDE se lo indicará:
Así que simplemente trátelo como cualquier otro tipo anulable en Kotlin, y el error desaparecerá:
Aplicar cambios de diseño
En caso de Extensiones de Android Kotlin, los cambios de diseño se traducen instantáneamente en la generación de extensiones sintéticas, para que pueda usarlas de inmediato. En caso de ViewBinding, tienes que construir tu proyecto
Uso de diseño incorrecto
En caso de Extensiones de Android Kotlin, es posible importar extensiones sintéticas de diseño incorrecto, lo que provoca NullPointerException
. Lo mismo se aplica a ViewBinding, ya que podemos importar mal Binding
clase. Aunque, es más probable pasar por alto la importación incorrecta que el nombre de clase incorrecto, especialmente si el archivo de diseño tiene un buen nombre Activity
/Fragment
/View
, asi que ViewBinding tiene ventaja aquí.
Resumen de KAE vs ViewBinding
- Tipo de seguridad – Dibujar.
- Seguridad nula – Dibujar.
- Código repetitivo – KAE gana. De la documentación de Kotlin Android Extensions:
El complemento Kotlin Android Extensions nos permite obtener la misma experiencia que tenemos con algunas de estas bibliotecas, sin tener que agregar ningún código extra.
- Aplicar cambios de diseño – KAE gana. Los cambios son instantáneos en contraste con ViewBinding.
- Uso de diseño incorrecto – ViewBinding gana
Creo que existe un gran error sobre ViewBinding siendo reemplazo de KAE. La gente escucha palabras clave grandes y las repite sin verificarlo de antemano. Seguro, ViewBinding es la mejor opción para el desarrollo de Java en este momento (reemplazo de Cuchillo de mantequilla), pero hay poca o ninguna ventaja sobre KAE en Kotlin (ver Uso de diseño incorrecto sección).
Nota al margen:
Estoy seguro de que a la gente de DataBinding le gustará ViewBinding 🙂
ViewBinding
resuelto el mayor problema de kotlinx.android.synthetic
. En synthetic
vinculante si configura su vista de contenido en un diseño, luego escribe una identificación que solo existe en un diseño diferente, el IDE le permite autocompletar y agregar la nueva declaración de importación. A menos que el desarrollador verifique específicamente que sus declaraciones de importación solo importen las vistas correctas, no hay una forma segura de verificar que esto no cause un problema de tiempo de ejecución. Pero en ViewBinding
deberías usar tu layout
vinculando el objeto para acceder a sus vistas para que nunca invoque a una vista en un diseño diferente y si desea hacer esto, obtendrá un error de compilación, no un error de tiempo de ejecución. Aquí hay un ejemplo.
Creamos dos diseños llamados activity_main
y activity_other
al igual que :
activity_main.xml
activity_other.xml
Ahora bien, si escribe su actividad así:
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Application will crash because "message_other" doesn't exist in "activity_main"
message_other.text = "Hello!"
su código se compilará sin ningún error, pero su aplicación se bloqueará en tiempo de ejecución. Porque la vista con message_other
id no existe en activity_main
y el compilador no comprobó esto. Pero si usas ViewBinding
al igual que:
class MainActivity : AppCompatActivity()
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//This code will never compile and the IDE shows you an error
binding.message_other.text = "Hello!"
tu código nunca se compilará y Android Studio
muestra un error en la última línea.
kotlinx.android.synthetic ya no es una práctica recomendada, dijo Google en un mensaje de confirmación “uno de los hilos de Reddit
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 “
Sintéticos no está desarrollado por Google, es parte de la extensión de Android Kotlin diseñada por JetBrains y gradualmente los desarrolladores de Android de Google comenzaron a reemplazar Synthetics con ViewBindins en sus demostraciones y códigos fuente.
“Ahora viene la pregunta, cuál tenemos que tomar en consideración”.
Según Google (View binding, ButterKnife, Kotlin Synthetics), muchas aplicaciones utilizan estas bibliotecas con éxito y resuelven el mismo problema.
Pero para la mayoría de las aplicaciones, Google recomienda probar el enlace de vista en lugar de estas bibliotecas Porque el enlace de vista proporciona una búsqueda de vista más segura y concisa.
Imagen de referencia adjunta para aclarar las cosas rápidamente.
Sin embargo, si desea profundizar, puede seguir el enlace que se proporciona a continuación. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
Si posees alguna indecisión o disposición de mejorar nuestro escrito eres capaz de realizar un exégesis y con deseo lo ojearemos.