如何在 Kotlin 中创建视图扩展函数

How to create a View extension function in Kotlin

我正在尝试在 Kotlin 中创建扩展函数。我确实尝试了几个教程,但不太明白如何实现这个。

我正在尝试创建一个 setWidth() 函数

//Find my_view in the fragment
val myView = v.findViewById<RelativeLayout>(R.id.my_view)

//Then use the extension function
myView.setNewWidth(500)

这就是我定义扩展函数的方式


private fun View?.setNewWidth(i: Int) {
    val layoutParams: ViewGroup.LayoutParams = View.layoutParams
    layoutParams.width = i
    View.layoutParams = layoutParams
}

我不明白我需要在这里做什么。

我想将扩展函数调用为myView.ExtensionFunction(),但我不知道该怎么做。这些教程没有提供任何信息。

好的,所以我的问题是我不知道如何获取对调用视图的引用。即,我不知道如何调用 myView 并在扩展函数 setNewWidth()

中设置它的 属性

所以,我尝试使用 this? 并且成功了。

然后,我对 myView 的扩展函数做了一些更改,它是 Relative Layout.

这是我的计算结果:

private fun RelativeLayout?.setWidth(i: Int) {
    val layoutParams: ViewGroup.LayoutParams? = this?.layoutParams
    layoutParams?.width = i
    this?.layoutParams = layoutParams
}

我认为这里的主要问题是如何定义扩展函数,特别是具有 View.layoutParams 的行 - 这是在 View 上调用静态 属性 '存在。您需要使用实例中的那个。如果您像这样编写扩展函数:

private fun View?.setNewWidth(i: Int) {
  val layoutParams = this?.layoutParams
  layoutParams?.width = i
  this?.layoutParams = layoutParams
}

然后你就可以随意调用方法了。就我个人而言,我觉得这不是那么可读,我会在这里删除可空性并将其写为:

private fun View.setNewWidth(i: Int) {
  val newLayoutParams = layoutParams
  newLayoutParams?.width = i
  layoutParams = newLayoutParams
}

唯一的区别是现在您需要 ?. 在视图可以为 null 的情况下调用该方法,我个人认为这很好 - myView?.setNewWidth(123)。我假设大多数时候您不会有可为 null 的视图。