Функция диалога из другого файла (котлин, аndroid)

В MainActivity кнопка запускает код из другого файла

val btnExit: Button = findViewById<Button>(R.id.btnExit) as Button
btnExit.setOnClickListener {
   exitSid()
}

код из другого файла, имя пакета одинаковое

https://pastebin.com/embed/NaExjTDB

fun exitSid() {
    val alertDialogBuilder = AlertDialog.Builder(this)
 
    alertDialogBuilder.setTitle("Закрыть программу")
    alertDialogBuilder.setIcon(R.drawable.appicon)
    alertDialogBuilder.setMessage("Выйти из программы?")
    alertDialogBuilder.setCancelable(false)
    alertDialogBuilder.setPositiveButton("Выйти"){_,_ ->
        Toast.makeText(this,"exiting!",Toast.LENGTH_SHORT).show()
    }
    alertDialogBuilder.setNegativeButton("Нет"){_,_ ->
        Toast.makeText(this,"Вы не вышли из программы!",Toast.LENGTH_SHORT).show()
    }
    alertDialogBuilder.setNeutralButton("Cancel"){_,_ ->
        Toast.makeText(this,"Вы отменили выход из программы!",Toast.LENGTH_SHORT).show()
    }
    val alertDialog = alertDialogBuilder.create()
    alertDialog.show()
}

Проблема: программа ругается на this


Ответы (1 шт):

Автор решения: Vadik

В языке Kotlin, так же как и в Java, this — это ссылка на текущий объект. Находясь внутри глобальной функции, никакого объекта нет, ссылаться на this не имеет смысла (кроме случая с экстеншен-функцией, см. ниже). Поэтому вы и получаете ошибку компиляции.

Многим сущностям в андроиде нужен контекст. Почитайте, какие они бывают.

Как исправить ошибку? Два варианта:

  1. Передать контекст как аргумент:

    fun exitSid(context: Context) {
        Toast.makeText(context, "exiting!", LENGTH_SHORT).show()
    }
    

    Из активити можно вызвать так (активити является контекстом):

    exitSid(this)
    
  2. Либо передать контекст как ресивер, то есть сделать функцию экстеншен-функцией, тогда this снова обретет смысл:

    fun Context.exitSid() {
        Toast.makeText(this, "exiting!", LENGTH_SHORT).show()
    }
    

    В этом случае из активити эта функция вызывается так:

    this.exitSid()
    

    Или просто:

    exitSid()
    
→ Ссылка