我是科特林的新手。我发现并尝试findViewById
在我的Activity
类中使用合成方法而不是烦人的方法,但我发现“如果我们想在 View 上调用合成属性(在适配器类中很有用),我们还应该导入 kotlinx.android.synthetic.main 。看法。*。” 但我无法弄清楚它究竟是如何工作的?有没有例子?
7 回答
来自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()
简单有效!
科特林 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!"
}
}
你需要
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)
}
这意味着您必须将此行放在源文件的开头:
import kotlinx.android.synthetic.main.view.*
所以现在,例如,findView(R.id.textView) as TextView
您将只写textView
. 后者是位于 package 中的综合扩展属性kotlinx.android.synthetic.main.view
,这就是为什么您必须从中导入所有内容的原因。
官网有教程,看一下。
仅供参考:对于视图查找,建议使用数据绑定而不是合成。
来自 Google在 Reddit 上的 Android DA 评论
嘿!此处为 Google 的 Android 开发者倡导者!
我想在这里添加一些背景。具有合成视图的 Kotlin Extensions 从未被故意“推荐”,尽管不应将其视为不使用它们的建议。如果它们为您工作,请随时在您的应用中继续使用它们!
我们一直在远离它们(例如,我们不在 Udacity 课程中教授它们),因为它们暴露了一个与布局无关的 id 的全局命名空间,该布局实际上是膨胀的,没有针对无效查找的检查,仅限 Kotlin,并且不要'当视图仅存在于某些配置中时,不暴露可空性。总之,这些问题会导致 API 增加 Android 应用程序的崩溃次数。
另一方面,他们确实提供了一个轻量级的 API,可以帮助简化视图查找。在这个领域,还值得一看 Data Binding,它还可以自动查找视图 - 以及与 LiveData 集成以在数据更改时自动更新您的视图。
今天,这个领域有一些可行的选择:
数据绑定是视图查找和绑定的建议,但与 Android Kotlin 扩展相比,它确实增加了一些开销。值得一看,看看这是否适合您的应用程序。数据绑定还允许您观察 LiveData 以在数据更改时自动绑定视图。与 Kotlin Extensions 相比,它增加了视图查找和类型安全的编译时检查。官方不推荐 Android Kotlin Extensions(这与推荐反对不同)。它确实带有上述问题,因此对于我们的代码,我们没有使用它们。Butter Knife 是另一种非常流行的解决方案,适用于 Kotlin 和 Java 编程语言。阅读这里的评论' 许多开发人员对 Kotlin Extensions 非常满意。这太好了——在我们寻找继续改进 API 的方法时,我们会牢记这一点。如果您还没有看过 Data Binding,一定要试一试。
顺便说一句,我们的内部代码样式指南不打算直接应用于我们的代码库之外。例如,我们使用 mPrefixVariables,但没有理由让每个应用程序都遵循这种风格。