【问题标题】:How to create a View extension function in Kotlin如何在 Kotlin 中创建视图扩展函数
【发布时间】:2020-04-19 00:10:05
【问题描述】:

我正在尝试在 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(),但我不知道该怎么做。这些教程没有提供任何信息。

【问题讨论】:

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


    【解决方案1】:

    我认为这里的主要问题是如何定义扩展函数,特别是具有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)。我假设大多数时候你不会有一个可以为空的视图。

    【讨论】:

      【解决方案2】:

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

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

      然后,我对扩展功能进行了一些更改以适用于myView,即Relative Layout

      这是我的结果:

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

      【讨论】:

      • 您使用的是this,而不是this?。例如。你不能写val view = this?? 这里是 ?. 安全呼叫运算符的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2021-12-04
      相关资源
      最近更新 更多