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