如何在Kotlin中创建视图扩展功能

时间:2019-12-30 08:08:40

标签: android kotlin android-view extension-methods kotlin-extension

我正在尝试在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(),但是我不知道该怎么做。这些教程是无用的。

2 个答案:

答案 0 :(得分:3)

我认为这里的主要问题是扩展函数的定义方式,特别是具有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
}

唯一的区别是,如果视图可为空,那么您现在需要?.来调用该方法,我个人认为很好-myView?.setNewWidth(123)。我认为大多数时候您不会有可为空的视图。

答案 1 :(得分:0)

好的,所以我的问题是我不知道如何获得对调用View的引用。即,我不知道如何调用myView并将其属性设置在扩展函数setNewWidth()

因此,我尝试使用this?并成功。

然后,我对扩展功能做了一些更改,以使其适用于myView的{​​{1}}。

这是我解决的问题:

Relative Layout