Soy nuevo en Kotlin. Encontré y traté de usar un método sintético en lugar de un método molesto findViewByIden mi Activityclase, 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
LayoutContainerinterfaz: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 aViewHolderdisuadir.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 TextViewescribirí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