我是科特林的新手。我发现并试图用合成的方法,而不是恼人的方法findViewById
在我的Activity
课,但我发现“如果我们想打电话查看合成属性(适配器类有用的),我们也应导入kotlinx.android.synthetic.main 。视图。*。” 但是我不知道它是如何工作的?有没有例子?
Answers:
来自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()
}
}
}
不用写
val view = itemView.findViewById(R.id.date) as TextView
view.text = forecast.date.toDateString()
只是
itemView.date.text = forecast.date.toDateString()
简单有效!
Kotling 1.1.4淘汰
更多信息:https : //antonioleiva.com/kotlin-android-extensions/
您需要通过将以下代码添加到build.gradle来启用Kotlin Android扩展:
apply plugin: 'org.jetbrains.kotlin.android.extensions'
androidExtensions {
experimental = true
}
自Kotlin发行新版本以来,Android扩展已合并了一些有趣的新功能:任何类中的缓存(有趣的是包括ViewHolder)
在ViewHolder(或任何自定义类)上使用它。请注意,此类应实现LayoutContainer
接口:
class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),
LayoutContainer {
fun bind(title: String) {
itemTitle.text = "Hello Kotlin!"
}
}
1.3.21
。我认为他们不会实施它
containerView.itemTitle.text = "Hello Kotlin!"
,我认为就够了
你需要
import kotlinx.android.synthetic.row_wall.view.*
后来的事情大致如下:
convertView.titleText.text = item.title
关键是view。*引入了对View类的扩展。
尝试
class CustomViewModel(val baseView: View) {
val firstName = baseView.firstName
val lastName = baseView.lastName
}
视图对象公开视图参考:https : //discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
如果您使用的是最新版本l ;,则无需在其中添加实验性= true。
在项目级别的Gradle中
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
在应用程式等级Gradle中
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
并在依赖中..
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
并导入为
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
和例子
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
}
}
BaseViewHolder在哪里
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(layoutID, parent, false)
) {
abstract fun bindData(model: T)
}
.view.*
导入会失败的目的,后退将是findViewById<>
每次-一个ViewHolder
劝阻的模式。
findViewById()
在上调用方法View
,例如holder.findViewById(R.id.name)
。使用Kotlin Android扩展,您可以编写holder.name
。假设此代码编写在getView()
函数内部:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
仅供参考:对于视图查找,建议使用数据绑定而非合成。
来自Google在Reddit上的Android版DA的评论
嘿! Google的Android开发者倡导者!
我想在这里添加一些背景。从来没有刻意“推荐”具有综合视图的Kotlin扩展,但不应将其作为不使用它们的建议。如果它们正在为您工作,请随时在您的应用中继续使用它们!
我们一直在远离它们(例如,我们不在Udacity课程中教他们),因为它们公开了ID的全局名称空间,该名称空间与实际上并未夸大无效查找的布局无关的ID,仅是Kotlin,并且不当视图仅在某些配置中存在时,不会公开可空性。这些问题共同导致API增加Android应用程序的崩溃次数。
另一方面,它们确实提供了轻量级的API,可以帮助简化视图查找。在此空间中,还值得一看的是Data Binding,它也执行自动视图查找-并与LiveData集成以在数据更改时自动更新视图。
如今,在这个领域中有一些可行的选择:
建议使用数据绑定进行视图查找和绑定,但是与Android Kotlin扩展相比,它确实增加了一些开销。值得一看,看看这是否适合您的应用程序。数据绑定还允许您观察LiveData在数据更改时自动绑定视图。与Kotlin Extensions相比,它增加了视图查找和类型安全性的编译时检查。官方不建议您使用Android Kotlin扩展程序(这与针对它的建议不同)。它确实带有上述问题,因此对于我们的代码,我们不使用它们。Butter Knife是另一种非常流行的解决方案,适用于Kotlin和Java编程语言。在这里阅读评论 许多开发者对Kotlin Extensions感到很幸运。太好了-在寻找继续改进API的方式时,我们会牢记一些事情。如果您还没有看过数据绑定,那么一定要尝试一下。
顺便说一句,我们的内部代码样式指南不能直接在我们的代码库之外应用。例如,我们使用mPrefixVariables,但是没有理由每个应用程序都应该遵循这种风格。