Функция расширения Котлина – Как сделать его глобальным?

Я создал функцию расширения Kotlin в классе Android ViewGroup чтобы легче ViewGroup . Итак, вот мое расширение:

 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 и MyArrayAdapter предназначены для использования по всему проекту.

Если вы определяете функцию расширения здесь (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 

Я объявил это расширение в классе адаптера, который я использую для recyclerview, чтобы он мог облегчить обращение к инфляции.

Подобно этому, он может использоваться только в контексте класса адаптера.

Либо объявите его на уровне пакета ( верхний уровень ), либо рассмотрите определение объекта, содержащего расширение:

 object ViewGroupExt { //extensions go here } 

Теперь на стороне вызывающего абонента вам нужно включить ViewGroupExt в область видимости:

 with(ViewGroupExt){ //call extensions } 

Это, по сравнению с заявлением на уровне пакета, имеет то преимущество, что его доступ должен быть явным .

Intereting Posts
Kotlin, как получить searchView submit Текст ярлыка не обновляется, хотя поток пользовательского интерфейса кажется отзывчивым Как отобразить Список << MyClass> в список <T>? DSL-подобный OnClick-прослушиватель для пользовательского представления с использованием kotlin в Android Почему код в выражении объекта может обращаться к переменным из области, содержащей его в kotlin? Понять, как в Котлине действуют переопределенные и подстановочные знаки Android: ошибка внутреннего компилятора при использовании кинжала 2 (Kotlin) Запечатанный класс безопасности типа для заявлений – kotlin Как создать сложный класс, который может предложить некоторые классы для расширения в будущем в Котлине? Статические поля в котлине Высота просмотра равна 0 при определенных условиях при переходе между действиями Позиция метки `@` в Котлине, обозначая приемник с `this` Kotlin: Java не может разрешить символ Котлина? Как хранить BigDecimal в Firebase? Kotlin: Объявление подклассов Activity static