Intereting Posts
Как преобразовать Int в Hex String в Kotlin? сигнал 7 (SIGBUS), код 2 (BUS_ADRERR) Весна MVC Тимелеаф Котлин Как издеваться над реактивным репозиторием, который возвращает Observable Синтаксис вторичного построения kotlin Подкласс класса закрытого класса Kotlin должен быть отлит в базовый класс, если он представлен как RxJava Observable Избавление от lateinit при конвертации Spring Java8 Junit test в Kotlin Импортировать библиотеки зависимостей в терминале kotlinc Параметр принудительного типа должен быть инвариантным на сайте-участнике, когда он является ковариантным на сайте объявления Пример Kotlin Quasar не работает В чем разница между var map = HashMap <Int, String> () и var map = HashMap <Int, String> (n)? Доступ с использованием классов Apollo из подпакета – Kotlin Сигнал / событие AboutToQuit в Android Kotlin: как преобразовать тест, который использует Thread.sleep для RxJava TestScheduler Spring Data Neo4j 5's EntityScan содержит сопутствующие объекты при использовании Kotlin

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

Я создал функцию расширения 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 } 

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