💻10 функции высшего порядка используемые в проектах Android.



👂Слушатели событий

Слушатели событий  —  распространенный случай использования функций высшего порядка при разработке Android. Рассмотрим следующую функцию, которая принимает в качестве аргумента функцию высшего порядка для обработки события нажатия кнопки:

fun View.onClick(action: () -> Unit) {

setOnClickListener { action() }

}




Эта функция расширяет класс View и принимает лямбда-выражение, которое будет выполняться при нажатии по представлению (view). Для настройки слушателя нажатия для представления используется метод setOnClickListener, а лямбда-выражение выполняется, когда происходит событие нажатия.

Используя эту функцию, можно обрабатывать события нажатия кнопки кратким и читабельным способом:

button.onClick {

Toast.makeText(context, "Button clicked", Toast.LENGTH_SHORT).show()

}




🖼Анимация представлений

Анимация в Android легче сделать гибкой и многоразовой, используя функции высшего порядка. Вот пример расширения класса View с функциями высшего порядка для анимации свойств:

fun View.animateProperty(

property: KProperty0<Float>,

fromValue: Float,

toValue: Float,

duration: Long,

onComplete: () -> Unit = {}

) {

val animator = ObjectAnimator.ofFloat(this, property.name, fromValue, toValue).apply {

setDuration(duration)

addListener(object : AnimatorListenerAdapter() {

override fun onAnimationEnd(animation: Animator?) {

onComplete()

}

})

}

animator.start()

}




📃RecyclerView

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

fun <T> RecyclerView.bindData(

data: List<T>,

layoutRes: Int,

bindFunc: (View, T) -> Unit,

clickListener: ((T) -> Unit)? = null

) {

adapter = object : RecyclerView.Adapter<ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

val view = LayoutInflater.from(parent.context).inflate(layoutRes, parent, false)

return ViewHolder(view)

}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

val item = data[position]

bindFunc(holder.itemView, item)

clickListener?.let { listener ->

holder.itemView.setOnClickListener { listener(item) }

}

}

override fun getItemCount() = data.size

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

}

}




🖊Обработка разрешений

Обработка разрешений  —  распространенная задача при создании мобильных приложений.



Вот пример реализации на языке Kotlin:

fun Activity.withPermissions(vararg permissions: String, callback: () -> Unit) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

val ungrantedPermissions = permissions.filter {

checkSelfPermission(it) == PackageManager.PERMISSION_DENIED

}

if (ungrantedPermissions.isEmpty()) {

// Все разрешения предоставлены, выполнить обратный вызов

callback()

} else {

// Запрос разрешений

requestPermissions(ungrantedPermissions.toTypedArray(), 0)

}

} else {

// Устройства до версии Marshmallow, выполнение обратного вызова

callback()

}

}




Эту функцию можно использовать следующим образом:

withPermissions(

Manifest.permission.CAMERA,

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE

) {

// Код для выполнения при получении разрешений

}




Читать дальше



@android_its