88

我是科特林的新手。我发现并尝试findViewById在我的Activity类中使用合成方法而不是烦人的方法,但我发现“如果我们想在 View 上调用合成属性(在适配器类中很有用),我们还应该导入 kotlinx.android.synthetic.main 。看法。*。” 但我无法弄清楚它究竟是如何工作的?有没有例子?

4

7 回答 7

102

来自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()

简单有效!

于 2015-10-30T03:31:39.300 回答
39

科特林 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!"
    }
}
于 2017-08-18T07:17:56.527 回答
11

你需要

import kotlinx.android.synthetic.row_wall.view.*

后来的一些事情是:

convertView.titleText.text = item.title

关键是 view.* 引入了 View 类的扩展。

于 2015-11-11T17:42:50.997 回答
8

尝试

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

于 2018-08-01T23:43:01.997 回答
4

如果您使用的是最新版本 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)
}
于 2019-02-15T11:12:51.020 回答
1

这意味着您必须将此行放在源文件的开头:

import kotlinx.android.synthetic.main.view.*

所以现在,例如,findView(R.id.textView) as TextView您将只写textView. 后者是位于 package 中的综合扩展属性kotlinx.android.synthetic.main.view,这就是为什么您必须从中导入所有内容的原因。

官网有教程,看一下。

于 2015-10-23T14:56:56.030 回答
0

仅供参考:对于视图查找,建议使用数据绑定而不是合成。

来自 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,但没有理由让每个应用程序都遵循这种风格。

于 2019-07-23T15:46:44.463 回答