Jestem nowy w Kotlinie. Znalazłem i próbowałem użyć metody syntetycznej zamiast irytującej metody findViewById
w mojej Activity
klasie, ale znalazłem „Jeśli chcemy wywołać właściwości syntetyczne w widoku (przydatne w klasach adapterów), powinniśmy również zaimportować kotlinx.android.synthetic.main .widok.*." Ale nie mogę dowiedzieć się, jak to dokładnie działa? Czy są jakieś przykłady?
kotlin
kotlin-android-extensions
busylee
źródło
źródło
Odpowiedzi:
Prosty przykład z 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() } } }
Nie musisz pisać
val view = itemView.findViewById(R.id.date) as TextView view.text = forecast.date.toDateString()
Właśnie
Proste i skuteczne!
źródło
Kotling 1.1.4 out
Więcej informacji: https://antonioleiva.com/kotlin-android-extensions/
Musisz włączyć rozszerzenia Kotlin dla systemu Android, dodając to do pliku build.gradle:
apply plugin: 'org.jetbrains.kotlin.android.extensions' androidExtensions { experimental = true }
Od tej nowej wersji Kotlin rozszerzenia Androida zawierały kilka nowych interesujących funkcji: pamięci podręczne w dowolnej klasie (co ciekawe zawiera ViewHolder)
Używanie go w ViewHolder (lub dowolnej klasie niestandardowej). Zauważ, że ta klasa powinna implementować
LayoutContainer
interfejs:class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" } }
źródło
1.3.21
. Myślę, że nie zamierzają tego zaimplementowaćcontainerView.itemTitle.text = "Hello Kotlin!"
i myślę, że wystarczyPotrzebujesz
import kotlinx.android.synthetic.row_wall.view.*
A później coś w rodzaju:
Chodzi o to, że view. * Wprowadza rozszerzenia do klasy View.
źródło
Próbować
class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }
Widok obiektu udostępnia widoki ref: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
źródło
Jeśli używasz najnowszej wersji l;., Nie musisz dodawać do niej Experimental = true.
na poziomie projektu Gradle
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
A na poziomie aplikacji Gradle
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
iw zależnościach.
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
i importuj poniżej jako
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
i przykład
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 } }
gdzie BaseViewHolder jest
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder( LayoutInflater.from(parent.context).inflate(layoutID, parent, false) ) { abstract fun bindData(model: T) }
źródło
.view.*
importu mija się z celem, zafindViewById<>
każdym razem wyjściem będzie powrót do samego wzorca, od któregoViewHolder
odradza.Oznacza to, że musisz umieścić tę linię na początku pliku źródłowego:
import kotlinx.android.synthetic.main.view.*
Więc teraz zamiast, na przykład,
findView(R.id.textView) as TextView
napiszesz po prostutextView
. Ta ostatnia jest syntetyczną właściwością rozszerzenia znajdującą się w pakieciekotlinx.android.synthetic.main.view
, dlatego musisz zaimportować z niej wszystko.Na oficjalnej stronie jest samouczek , spójrz.
źródło
findViewById()
metodę naView
, jakholder.findViewById(R.id.name)
. Dzięki rozszerzeniom Kotlin na Androida możesz po prostu pisaćholder.name
. Załóżmy, że ten kod jest zapisany wgetView()
funkcji:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
FYI: powiązanie danych jest zalecane zamiast syntetycznego do wyszukiwania widoków.
Komentarz od DA dla Androida z Google na Reddit
źródło