3

我在 AndroidViewGroup类上创建了一个 Kotlin 扩展函数,以便它可以更轻松地进行布局膨胀调用。所以,这是我的扩展:

fun ViewGroup.inflate(layoutRes: Int): View {
    return LayoutInflater.from(context).inflate(layoutRes, this, false)
}

然后我可以在适配器类中使用它来扩展布局:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = parent.inflate(R.layout.view_item)
    return ViewHolder(v)
}

我已经在我用于 RecyclerView 的适配器类中声明了这个扩展,以便它可以使通货膨胀调用更容易。但我想要所有适配器,或者我应该说所有ViewGroup类都可以看到这个扩展。我想要它永久的。

它似乎只是停留在我宣布它不是全球性的地方。我应该在哪里声明此扩展,以便在我使用视图组时,此方法扩展可用?

4

3 回答 3

4

问题:

如果您在此处定义扩展函数 (1),它将可以全局访问,但这是不好的样式,因为这是(特殊适配器)的类文件,MyArrayAdapter并且inflate打算在项目范围内使用。

如果您在此处定义扩展函数 (2),它将只能在MyArrayAdapter.

// (1)
class MyArrayAdapter: ArrayAdapter<String> {
   // (2)
}

我会做什么:

创建一个仅包含用作实用程序的顶级声明的文件Util.kt。

这就是您的Util.kt文件的样子:

package com.yourpackagepath // package in which Utils.kt resides

// written with expression body, which makes it more concise
fun ViewGroup.inflate(layoutRes: Int) = LayoutInflater.from(getContext()).inflate(layoutRes, this, false)

通过这种方式,扩展在项目范围内可用,而且风格很好,因为Util.kt意味着可以在任何地方使用的全局实用程序。

你可以这样称呼它:

val v = parent.inflate(R.layout.view_item)

如果您不在同一个包中使用它,请像这样导入它:

import com.yourpackagepath.inflate
于 2018-01-09T08:46:55.913 回答
2

您可以通过在对象类中声明来使扩展功能全局化,如下所示:

object ViewExtension{

 fun Spinner.validate(): Boolean  {
    if(!this.isSelected){
        this.setSpinnerHint(this.context.getString(R.string.please_select))
        return false
    }
    return true
 }

 fun TextInputLayout.validate(): Boolean{
    if(TextUtils.isEmpty(editText?.text)){
        this.error =  this.context.getString(R.string.required)
        return false
    }
    return true
 }
}

如何使用扩展功能

fun validateFields(): Boolean{
    var allSelected = true

    textInput.validate().apply {
        if(!this)
            allSelected = false
    }
    
    spinner.validate().apply {
        if(!this)
            allSelected = false
    }

 }

我们还需要在使用任何类之前导入 validate 方法:

import com.example.ViewExtension.validate
于 2020-06-21T10:33:33.330 回答
1

我已经在我用于 recyclerview 的适配器类中声明了这个扩展,以便它可以使通货膨胀调用更容易。

像这样,它只能在适配器类的上下文中使用。

要么在包级别(顶级)声明它,要么考虑定义一个包含扩展的对象:

object ViewGroupExt {
    //extensions go here
}

现在在调用方方面,您需要将ViewGroupExt其纳入范围:

with(ViewGroupExt){
   //call extensions
}

与包级声明相比,这具有必须使其访问权限显式的优点。

于 2018-01-09T04:40:43.953 回答