Je suis nouveau à Kotlin. J'ai trouvé et essayé d'utiliser la méthode synthétique au lieu de la méthode agaçante findViewById
dans ma classe Activity
, mais j'ai trouvé "Si nous voulons appeler les propriétés synthétiques sur View (utile dans les classes d'adaptateur) , nous devrions également importer kotlinx.Android.synthetic.main.view. *. " Mais je n'arrive pas à comprendre comment cela fonctionne exactement? Y a-t-il des exemples?
Exemple simple tiré 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()
}
}
}
Pas besoin d'écrire
val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()
Juste
itemView.date.text = forecast.date.toDateString()
Simple et efficace!
Kotling 1.1.4 sur
Informations complémentaires: https://antonioleiva.com/kotlin-Android-extensions/
Vous devez donc les activer en vous ajoutant ceci build.gradle:
apply plugin: 'org.jetbrains.kotlin.Android.extensions'
androidExtensions {
experimental = true
}
Depuis cette nouvelle version de Kotlin, les extensions Android ont incorporé de nouvelles fonctionnalités intéressantes: des caches dans n’importe quelle classe (qui inclut de manière intéressante ViewHolder)
Utilisation sur un ViewHolder (ou une classe personnalisée)
class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),
LayoutContainer {
fun bind(title: String) {
itemTitle.text = "Hello Kotlin!"
}
}
Vous avez besoin
import kotlinx.Android.synthetic.row_wall.view.*
Et plus tard, quelque chose du genre:
convertView.titleText.text = item.title
Le fait est que la vue. * Introduit des extensions à la classe View.
Essayer
class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }
La vue objet expose les vues ref: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-Android-extension-in-adapter-class/289
Si vous utilisez la dernière version, vous ne devez pas y ajouter experimental = true.
au niveau du projet
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
Et au niveau de l'application Gradle
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions' //These should be on the top of file.
et dans les dépendances ..
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
et importer ci-dessous comme
import kotlinx.Android.synthetic.main.your_layout_file_name.view.*
et exemple
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
}
}
où BaseViewHolder est
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(layoutID, parent, false)
) {
abstract fun bindData(model: T)
}
Cela signifie que vous devez placer cette ligne au début de votre fichier source:
import kotlinx.Android.synthetic.main.view.*
Alors maintenant, au lieu de, par exemple, findView(R.id.textView) as TextView
, vous écririez simplement textView
. Ce dernier est une propriété d'extension synthétique située dans le paquetage kotlinx.Android.synthetic.main.view
, C'est pourquoi vous devez tout importer.
Il y a un tutoriel sur le site officiel , jetez un coup d'oeil.
À titre d'information: La liaison de données est recommandée sur la synthèse pour les consultations de vue.
Commentaire d'un DA pour Android de Google sur Reddit
Hey! Developer Advocate for Android sur Google ici!
Je voulais ajouter un peu de contexte ici. Kotlin Extensions avec des vues synthétiques n’a jamais été intentionnellement "recommandé", bien que cela ne devrait pas être considéré comme une recommandation de ne pas les utiliser. S'ils travaillent pour vous, n'hésitez pas à continuer de les utiliser dans votre application!
Nous nous sommes éloignés d'eux (par exemple, nous ne les enseignons pas dans le cours Udacity) car ils exposent un espace de noms global d'identifiants qui n'est pas lié à la présentation et qui est en fait gonflé sans vérification des recherches non valides, ne concerne que Kotlin. N'exposez pas la nullabilité lorsque les vues ne sont présentes que dans certaines configurations. Tous ensemble, ces problèmes entraînent une augmentation du nombre de crash de l'API pour les Android applications.
En revanche, ils offrent une API légère qui peut aider à simplifier les recherches d’affichage. Dans cet espace, il convient également de jeter un coup d'œil à la liaison de données, qui effectue également des recherches automatiques de vues - et s'intègre également à LiveData pour mettre à jour automatiquement vos vues au fur et à mesure de l'évolution des données.
Aujourd'hui, il y a quelques options dans cet espace qui fonctionnent:
La liaison de données est la recommandation recommandée pour la consultation des vues, mais elle ajoute un peu de charge supplémentaire par rapport à Android Extensions Kotlin. Cela vaut la peine de jeter un coup d'œil pour voir si cela convient. Data Binding vous permet également d’observer que LiveData lie automatiquement les vues lorsque celles-ci changent. Par rapport à Kotlin Extensions, il ajoute une vérification de la compilation des recherches et de la sécurité des vues. Android Kotlin Extensions est Ce n’est pas officiellement recommandé (ce qui n’est pas la même chose que la recommandation contre). Il vient avec les problèmes mentionnés ci-dessus, donc pour notre code nous ne les utilisons pas. Butter Knife est une autre solution extrêmement populaire qui fonctionne aussi bien pour Kotlin Java Langage de programmation. En parcourant les commentaires ici, beaucoup de développeurs ont de la chance avec les extensions Kotlin. C’est génial - et nous garderons cette idée à l’esprit lorsque nous examinerons les moyens de continuer amélioration de nos API. Si vous n’avez pas examiné la liaison de données , décidément donner un coup de feu.
De plus, notre guide de style de code interne n'est pas destiné à être appliqué directement à l'extérieur de notre base de code. Par exemple, nous utilisons mPrefixVariables, mais il n’ya aucune raison pour que chaque application suive ce style.