DANFA

Kotlin: Функции, лямбды и обработка нажатий

Функции: Основы


Функция — это блок кода, который выполняет определённое действие и может быть вызван многократно.

Синтаксис:
fun имяФункции(параметры): ТипВозврата {
    // тело функции
    return результат
}

Пример простой функции:
fun addNumbers(a: Int, b: Int): Int {
    return a + b
}

// Вызов
val sum = addNumbers(5, 3)  // sum = 8

Важные моменты:
  • fun — ключевое слово для объявления функции.
  • Типы параметров и возвращаемого значения указываются явно.
  • Если функция не возвращает значение, тип возврата — Unit (можно не указывать).

Функции без возвращаемого значения


Когда функция выполняет действие, но не возвращает результат:
fun showMessage(message: String) {
    println(message)
}

// Вызов
showMessage("Привет из функции!")

Значения параметров по умолчанию


Можно задать значения по умолчанию, чтобы не указывать их при вызове:
fun greet(name: String = "Гость") {
    println("Привет, $name!")
}

// Варианты вызова:
greet()               // "Привет, Гость!"
greet("Юля")          // "Привет, Юля!"

Именованные аргументы


При вызове можно явно указывать имена параметров:
fun createUser(name: String, age: Int, isActive: Boolean) {
    println("$name, $age лет, активен: $isActive")
}

// Вызов с именованными аргументами
createUser(name = "Маша", age = 25, isActive = true)

Лямбда‑выражения


Лямбда — это анонимная функция, которую можно передать как параметр.

Синтаксис:
{ параметры -> тело_лямбды }

Пример:
val square = { x: Int -> x * x }
println(square(5))  // 25

Использование в функциях:
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():
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) делает контейнер главным видом активности.

Добавляем обработчик нажатия
После создания кнопки добавьте:
button.setOnClickListener {
    textView.text = "Кнопка нажата! Время: ${System.currentTimeMillis()}"
}

Как это работает:
  • setOnClickListener принимает лямбда‑выражение.
  • Внутри лямбды меняем текст textView на новое значение.
  • System.currentTimeMillis() добавляет текущее время в миллисекундах (для наглядности).

Полный код onCreate()
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. Отдельная функция-обработчик
private fun updateTextView(textView: TextView) {
    textView.text = "Обработка через функцию! ${System.currentTimeMillis()}"
}

// В onCreate() после создания кнопки:
button.setOnClickListener {
    updateTextView(textView)
}

Вариант 2. Использование лямбды с параметром view
button.setOnClickListener { clickedView ->
    (clickedView as Button).text = "Нажата!"
    textView.text = "ID кнопки: ${clickedView.id}"
}

Вариант 3. Обработка нескольких кнопок
Если у вас несколько кнопок, можно использовать when:
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!"
    }
}

Практическое задание


  1. Создайте вторую кнопку (button2) программно.
  2. При нажатии на button1 выводите в textView текст:
    «Кнопка 1 нажата в ${System.currentTimeMillis()}»
    
  3. При нажатии на button2 меняйте текст button1 на «Активировано!».
  4. Используйте лямбда‑выражения для обоих обработчиков.

Ожидаемый результат:
  • При запуске — две кнопки и текст «Ожидание нажатия…».
  • Нажатие button1 — обновление текста в textView.
  • Нажатие button2 — изменение текста button1.

Отладка и типичные ошибки


  • «NullPointerException» — убедитесь, что textView и button созданы до использования в обработчике.
  • «Unresolved reference» — проверьте, что переменные объявлены в той же области видимости.
  • «No view found» — если используете findViewById, убедитесь, что элемент добавлен в контейнер.

Что дальше?


В следующем уроке разберём:
  • Классы и объекты;
  • Конструкторы и свойства;
  • Наследование и интерфейсы.


Автор:  03.02.2026 07:10:14 am