Kotlin扩展function – 如何使其成为全球?

我已经在Android ViewGroup类上创建了一个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类来看这个扩展。 我想永久。

它似乎只是坚持在我宣布它不全球的地方。 我应该在哪里声明这个扩展,以便在任何时候使用视图组时,这个方法扩展将是可用的?

问题:

如果你在这里定义了扩展函数(1),它将被全局访问,但这是不好的风格,因为这是(一个特殊的适配器) MyArrayAdapter的类文件, inflate是为了在项目范围内使用。

如果你在这里定义了扩展函数(2),它只能在MyArrayAdapter的上下文中MyArrayAdapter

 // (1) class MyArrayAdapter: ArrayAdapter { // (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 

我已经在适配器类中声明了这个扩展,用于回收视图,这样可以使通货膨胀调用变得更容易。

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

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

 object ViewGroupExt { //extensions go here } 

现在在来电方,您需要将ViewGroupExt纳入范围:

 with(ViewGroupExt){ //call extensions } 

与包级声明相比,这样做的好处是必须明确其访问权限。