Функция диалога из другого файла (котлин, а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 шт):
В языке Kotlin, так же как и в Java, this — это ссылка на текущий объект. Находясь внутри глобальной функции, никакого объекта нет, ссылаться на this не имеет смысла (кроме случая с экстеншен-функцией, см. ниже). Поэтому вы и получаете ошибку компиляции.
Многим сущностям в андроиде нужен контекст. Почитайте, какие они бывают.
Как исправить ошибку? Два варианта:
Передать контекст как аргумент:
fun exitSid(context: Context) { Toast.makeText(context, "exiting!", LENGTH_SHORT).show() }Из активити можно вызвать так (активити является контекстом):
exitSid(this)Либо передать контекст как ресивер, то есть сделать функцию экстеншен-функцией, тогда
thisснова обретет смысл:fun Context.exitSid() { Toast.makeText(this, "exiting!", LENGTH_SHORT).show() }В этом случае из активити эта функция вызывается так:
this.exitSid()Или просто:
exitSid()