Soy nuevo en Kotlin. Encontré y traté de usar un método sintético en lugar de un método molesto findViewById
en mi Activity
clase, pero encontré "Si queremos llamar a las propiedades sintéticas en la Vista (útil en las clases de adaptadores), también deberíamos importar kotlinx.android.synthetic.main .ver.*." ¿Pero no puedo entender cómo funciona exactamente? ¿Hay ejemplos?
kotlin
kotlin-android-extensions
ocupado
fuente
fuente
Respuestas:
Ejemplo simple de https://github.com/antoniolg/Kotlin-for-Android-Developers
import kotlinx.android.synthetic.item_forecast.view.* class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindForecast(forecast: Forecast) { itemView.date.text = forecast.date.toDateString() } } }
No es necesario escribir
val view = itemView.findViewById(R.id.date) as TextView view.text = forecast.date.toDateString()
Sólo
¡Simple y eficaz!
fuente
Kotling 1.1.4 fuera
Más información: https://antonioleiva.com/kotlin-android-extensions/
Necesita habilitar las extensiones de Android Kotlin agregando esto a su build.gradle:
apply plugin: 'org.jetbrains.kotlin.android.extensions' androidExtensions { experimental = true }
Desde esta nueva versión de Kotlin, las Extensiones de Android han incorporado algunas características nuevas e interesantes: cachés en cualquier clase (que curiosamente incluye ViewHolder)
Usándolo en un ViewHolder (o cualquier clase personalizada). Tenga en cuenta que esta clase debe implementar la
LayoutContainer
interfaz:class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" } }
fuente
1.3.21
. Creo que no lo van a implementarcontainerView.itemTitle.text = "Hello Kotlin!"
y creo que es suficienteNecesitas
import kotlinx.android.synthetic.row_wall.view.*
Y luego algo como:
El punto es que view. * Introduce extensiones a la clase View.
fuente
Tratar
class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }
Ver objeto expone las vistas ref: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
fuente
Si está utilizando la última versión l; .no tiene que agregar experimental = true.
en el nivel de proyecto Gradle
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
Y en el nivel de aplicación Gradle
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
y en dependencias ..
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
e importar a continuación como
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
y ejemplo
import kotlinx.android.synthetic.main.item_animal.view.* class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) { override fun bindData(animal: Animal) { itemView.tv_animal.text = animal.title } }
donde BaseViewHolder es
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder( LayoutInflater.from(parent.context).inflate(layoutID, parent, false) ) { abstract fun bindData(model: T) }
fuente
.view.*
importación anula el propósito, la alternativa seráfindViewById<>
, cada vez, el mismo patrón del que aViewHolder
disuadir.Significa que debe colocar esta línea al comienzo de su archivo fuente:
import kotlinx.android.synthetic.main.view.*
Así que ahora en lugar de, por ejemplo,
findView(R.id.textView) as TextView
escribirías solotextView
. Esta última es una propiedad de extensión sintética ubicada en el paquetekotlinx.android.synthetic.main.view
, por eso tienes que importar todo desde él.Hay un tutorial en el sitio oficial , échale un vistazo.
fuente
findViewById()
método enView
, comoholder.findViewById(R.id.name)
. Con las extensiones de Kotlin para Android, puede escribir soloholder.name
. Supongamos que este código está escrito dentro de unagetView()
función:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
Para su información : se recomienda el enlace de datos en lugar de los sintéticos para las búsquedas de vistas.
Comentario de un DA para Android de Google en Reddit
fuente