Android Kotlin扩展功能-如何使其全球化?

Android Kotlin扩展功能-如何使其全球化?,android,kotlin,kotlin-extension,Android,Kotlin,Kotlin Extension,我在AndroidViewGroup类上创建了一个Kotlin扩展函数,这样它可以更轻松地进行布局膨胀调用。这是我的扩展: fun ViewGroup.inflate(layoutRes: Int): View { return LayoutInflater.from(context).inflate(layoutRes, this, false) } object ViewGroupExt { //extensions go here } 然后我可以在适配器类中这样使用它来

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

fun ViewGroup.inflate(layoutRes: Int): View {
    return LayoutInflater.from(context).inflate(layoutRes, this, false)
}
object ViewGroupExt {
    //extensions go here
}
然后我可以在适配器类中这样使用它来膨胀布局:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val v = parent.inflate(R.layout.view_item)
    return ViewHolder(v)
}
我在用于RecyclerView的适配器类中声明了这个扩展,这样可以使调用更容易。但是我想要所有适配器,或者我应该说所有
ViewGroup
类都可以看到这个扩展。我想要永久的

它似乎只是停留在我宣称的范围内,而不是全球范围内。我应该在哪里声明此扩展,以便在任何时候使用视图组时都可以使用此方法扩展

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

与此类似,它仅在适配器类的上下文中可用

要么在包级上声明它(<强>顶级),要么考虑定义包含扩展名的对象:

fun ViewGroup.inflate(layoutRes: Int): View {
    return LayoutInflater.from(context).inflate(layoutRes, this, false)
}
object ViewGroupExt {
    //extensions go here
}
现在,在调用者端,您需要将
ViewGroupExt
引入范围:

with(ViewGroupExt){
   //call extensions
}

与包级声明相比,它的优点是必须明确其访问。

问题:

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

如果在此处(2)定义扩展函数,则只能在
MyArrayAdapter
的上下文中访问它

// (1)
class MyArrayAdapter: ArrayAdapter<String> {
   // (2)
}
这样,扩展就可以在整个项目范围内使用,而且是一种很好的样式,因为Util.kt意味着要在任何地方使用的全局实用程序

你可以这样称呼它:

val v = parent.inflate(R.layout.view_item)
import com.yourpackagepath.inflate
如果不在同一软件包中使用,请按如下方式导入:

val v = parent.inflate(R.layout.view_item)
import com.yourpackagepath.inflate

通过在对象类中声明,您可以使扩展函数成为全局函数,如下所示:

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
 }
}
如何使用扩展功能

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

import com.example.ViewExtension.validate

我测试了这个,它是有效的。我希望有一种方法不使用闭包。我知道它使它显式,但有时我想为所有类使用添加功能,而不是与闭包一起使用。如果你有任何想法,请告诉我。我看到另一个答案试图在没有带闭包的情况下使用您的解决方案,但它对我不起作用。如果我将其声明为包级别,那么我还需要使用带闭包的解决方案吗?不,您不需要。但是你必须把它导入到其他类中。我认为我不需要在上下文中传递。ViewGroup已经有一个上下文getContext()。因此,它应该使用自己的上下文。您创建的是一个没有类的包级函数。我想我可以把UTIL放在这里。谢谢你的帮助。精彩的回答@SakshamKhurana很高兴它帮助了你!