Функции: Основы
Функция — это блок кода, который выполняет определённое действие и может быть вызван многократно.
Синтаксис:
ВыделитьKotlin
fun имяФункции(параметры): ТипВозврата {
// тело функции
return результат
}Пример простой функции:
ВыделитьKotlin
fun addNumbers(a: Int, b: Int): Int {
return a + b
}
// Вызов
val sum = addNumbers(5, 3) // sum = 8Важные моменты:
fun— ключевое слово для объявления функции.- Типы параметров и возвращаемого значения указываются явно.
- Если функция не возвращает значение, тип возврата —
Unit(можно не указывать).
Функции без возвращаемого значения
Когда функция выполняет действие, но не возвращает результат:
ВыделитьKotlin
fun showMessage(message: String) {
println(message)
}
// Вызов
showMessage("Привет из функции!")Значения параметров по умолчанию
Можно задать значения по умолчанию, чтобы не указывать их при вызове:
Выделитьkotlin
fun greet(name: String = "Гость") {
println("Привет, $name!")
}
// Варианты вызова:
greet() // "Привет, Гость!"
greet("Юля") // "Привет, Юля!"Именованные аргументы
При вызове можно явно указывать имена параметров:
Выделитьkotlin
fun createUser(name: String, age: Int, isActive: Boolean) {
println("$name, $age лет, активен: $isActive")
}
// Вызов с именованными аргументами
createUser(name = "Маша", age = 25, isActive = true)Лямбда‑выражения
Лямбда — это анонимная функция, которую можно передать как параметр.
Синтаксис:
ВыделитьKotlin
{ параметры -> тело_лямбды }Пример:
ВыделитьKotlin
val square = { x: Int -> x * x }
println(square(5)) // 25Использование в функциях:
ВыделитьKotlin
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
// Передача лямбды
val result = operate(4, 5) { x, y -> x + y } // result = 9Обработка нажатий кнопок
Можно создать и обработать кнопку полностью в коде Kotlin.
Создаём кнопку и TextView
В "MainActivity.kt" внутри
onCreate():
ВыделитьKotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Создаём контейнер для элементов
val rootLayout = LinearLayout(this)
rootLayout.orientation = LinearLayout.VERTICAL
rootLayout.gravity = Gravity.CENTER
rootLayout.setPadding(64, 64, 64, 64)
// Создаём TextView
val textView = TextView(this)
textView.text = "Ожидание нажатия..."
textView.textSize = 18f
textView.gravity = Gravity.CENTER
// Создаём кнопку
val button = Button(this)
button.text = "Нажми меня!"
button.setTextSize(16f)
// Добавляем элементы в контейнер
rootLayout.addView(textView)
rootLayout.addView(button)
// Устанавливаем контейнер как контент активности
setContentView(rootLayout)
}Что происходит:
LinearLayout— контейнер для размещения элементов вертикально.TextViewиButtonсоздаются через конструкторTextView(this)/Button(this), где this — контекст активности.- Элементы добавляются в контейнер через
addView(). setContentView(rootLayout)делает контейнер главным видом активности.
Добавляем обработчик нажатия
После создания кнопки добавьте:
ВыделитьKotlin
button.setOnClickListener {
textView.text = "Кнопка нажата! Время: ${System.currentTimeMillis()}"
}Как это работает:
setOnClickListenerпринимает лямбда‑выражение.- Внутри лямбды меняем текст
textViewна новое значение. System.currentTimeMillis()добавляет текущее время в миллисекундах (для наглядности).
Полный код onCreate()
ВыделитьKotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val rootLayout = LinearLayout(this)
rootLayout.orientation = LinearLayout.VERTICAL
rootLayout.gravity = Gravity.CENTER
rootLayout.setPadding(64, 64, 64, 64)
val textView = TextView(this)
textView.text = "Ожидание нажатия..."
textView.textSize = 18f
textView.gravity = Gravity.CENTER
val button = Button(this)
button.text = "Нажми меня!"
button.textSize = 16f
button.setOnClickListener {
textView.text = "Кнопка нажата! Время: ${System.currentTimeMillis()}"
}
rootLayout.addView(textView)
rootLayout.addView(button)
setContentView(rootLayout)
}Расширенные варианты обработчиков
Вариант 1. Отдельная функция-обработчик
ВыделитьKotlin
private fun updateTextView(textView: TextView) {
textView.text = "Обработка через функцию! ${System.currentTimeMillis()}"
}
// В onCreate() после создания кнопки:
button.setOnClickListener {
updateTextView(textView)
}Вариант 2. Использование лямбды с параметром view
ВыделитьKotlin
button.setOnClickListener { clickedView ->
(clickedView as Button).text = "Нажата!"
textView.text = "ID кнопки: ${clickedView.id}"
}Вариант 3. Обработка нескольких кнопок
Если у вас несколько кнопок, можно использовать
when:
ВыделитьKotlin
val button1 = Button(this)
button1.text = "Кнопка 1"
button1.id = View.generateViewId() // Генерируем уникальный ID
val button2 = Button(this)
button2.text = "Кнопка 2"
button2.id = View.generateViewId()
button1.setOnClickListener(buttonClickListener)
button2.setOnClickListener(buttonClickListener)
// Общий обработчик
val buttonClickListener = View.OnClickListener { clickedButton ->
when (clickedButton.id) {
button1.id -> textView.text = "Нажата Кнопка 1!"
button2.id -> textView.text = "Нажата Кнопка 2!"
}
}Практическое задание
- Создайте вторую кнопку (
button2) программно. - При нажатии на
button1выводите вtextViewтекст:«Кнопка 1 нажата в ${System.currentTimeMillis()}» - При нажатии на
button2меняйте текстbutton1на «Активировано!». - Используйте лямбда‑выражения для обоих обработчиков.
Ожидаемый результат:
- При запуске — две кнопки и текст «Ожидание нажатия…».
- Нажатие
button1— обновление текста вtextView. - Нажатие
button2— изменение текста button1.
Отладка и типичные ошибки
- «NullPointerException» — убедитесь, что
textViewиbuttonсозданы до использования в обработчике. - «Unresolved reference» — проверьте, что переменные объявлены в той же области видимости.
- «No view found» — если используете findViewById, убедитесь, что элемент добавлен в контейнер.
Что дальше?
В следующем уроке разберём:
- Классы и объекты;
- Конструкторы и свойства;
- Наследование и интерфейсы.