Ich bin neu in Kotlin. Ich habe findViewById
in meiner Activity
Klasse eine synthetische Methode anstelle einer nervigen Methode gefunden und versucht, sie zu verwenden , aber ich habe festgestellt: "Wenn wir die synthetischen Eigenschaften in View aufrufen möchten (nützlich in Adapterklassen), sollten wir auch kotlinx.android.synthetic.main importieren .Aussicht.*." Aber ich kann nicht herausfinden, wie es genau funktioniert? Gibt es Beispiele?
kotlin
kotlin-android-extensions
Busylee
quelle
quelle
Antworten:
Einfaches Beispiel von 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() } } }
Keine Notwendigkeit zu schreiben
val view = itemView.findViewById(R.id.date) as TextView view.text = forecast.date.toDateString()
Gerade
Einfach und effektiv!
quelle
Kotling 1.1.4 raus
Weitere Informationen: https://antonioleiva.com/kotlin-android-extensions/
Sie müssen Kotlin Android Extentions aktivieren, indem Sie dies zu Ihrem build.gradle hinzufügen:
apply plugin: 'org.jetbrains.kotlin.android.extensions' androidExtensions { experimental = true }
Seit dieser neuen Version von Kotlin haben die Android-Erweiterungen einige neue interessante Funktionen integriert: Caches in jeder Klasse (die interessanterweise ViewHolder enthält)
Verwenden in einem ViewHolder (oder einer benutzerdefinierten Klasse). Beachten Sie, dass diese Klasse die
LayoutContainer
Schnittstelle implementieren sollte :class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" } }
quelle
1.3.21
. Ich denke, sie werden es nicht implementierencontainerView.itemTitle.text = "Hello Kotlin!"
und ich denke, es ist genugDu brauchst
import kotlinx.android.synthetic.row_wall.view.*
Und später etwas in der Art von:
Der Punkt ist, dass die Ansicht. * Erweiterungen in die View-Klasse einführt.
quelle
Versuchen
class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }
Das Ansichtsobjekt macht die Ansichten verfügbar unter: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
quelle
Wenn Sie die neueste Version verwenden, müssen Sie nicht experimentell = true hinzufügen.
in Projektebene Gradle
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
Und auf App-Ebene Gradle
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
und in Abhängigkeiten ..
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
und unten importieren als
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
und Beispiel
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 } }
wo BaseViewHolder ist
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder( LayoutInflater.from(parent.context).inflate(layoutID, parent, false) ) { abstract fun bindData(model: T) }
quelle
.view.*
Import besiegt den Zweck, der Fallback wirdfindViewById<>
jedes Mal sein - genau das MusterViewHolder
, von dem man abhält.Dies bedeutet, dass Sie diese Zeile am Anfang Ihrer Quelldatei einfügen müssen:
import kotlinx.android.synthetic.main.view.*
Also würden Sie jetzt statt zum Beispiel
findView(R.id.textView) as TextView
nur schreibentextView
. Letzteres ist eine synthetische Erweiterungseigenschaft, die sich im Paketkotlinx.android.synthetic.main.view
befindet. Deshalb müssen Sie alles daraus importieren.Auf der offiziellen Website gibt es ein Tutorial .
quelle
findViewById()
Methode für aView
wie aufrufenholder.findViewById(R.id.name)
. Mit Kotlin Android Extensions können Sie einfach schreibenholder.name
. Angenommen, dieser Code ist in einegetView()
Funktion geschrieben:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
Zu Ihrer Information: Für die Ansichtssuche wird eine Datenbindung gegenüber einer synthetischen empfohlen.
Kommentar von einem DA für Android von Google auf Reddit
quelle