Як отримати доступ до "Activity.this" в Котліні?


128

У мене є цей фрагмент коду Java:

MaterialDialog builder = new MaterialDialog.Builder(MainActivity.this)

Я хочу отримати об’єкт MainActivity в Котліні. Автоматичне перетворення перервано на MainActivity.this.


Можливо this as MainActivity?
Марк Плано-Лесей

1
І якщо цей код не знаходиться всередині MainActivity, то до якого примірника MainActivityвін пов'язаний (і як)? До якого екземпляра ви хочете отримати доступ this?
гаряча клавіша

Працюючий код Java посилається лише на activity.this, настільки статичний? Я не впевнений, тхо.
Bal0r

Чи працює робочий код Java також у абсолютно окремому файлі?
йоле

Як цей код називається, якщо не в , MainActivityале все ще лиття thisв MainActivity? Можливо, у підкласі?
Марк Плано-Лесей

Відповіді:


237

Ви можете отримати посилання на ваш MainActivityоб’єкт у Котліні, скориставшись кваліфікованимthis . наприклад:

class MyActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@MyActivity)
}

1
Як щодо фрагмента? Я ввів контекст у фрагмент (з @ActivityContextатрибутом), тепер мені потрібна активність. Звичайно, я знаю про getActivity()(Котлін activity) у Фрагменті, але чи є другий спосіб нормальним чи тому, що у мене є контекст, краще використовувати його для доступу до діяльності?
Dr.jacky

@ Dr.jacky Я думаю, що ти можеш робити "(контекст як" YourActivity "). Тепер ви можете отримати доступ до своїх методів діяльності
Gian Gomen

@ siddarth-g Якщо у вас виникли проблеми з невирішеними посиланнями, тоді я рекомендую створити нове запитання з MCVE, щоб отримати допомогу.
mfulton26

@ mfulton26 його питання про компіляцію цей @ ActivityName також не працював для мене в іншому проекті.
Siddarth G


1

Якщо ви викликаєте Activity.this з внутрішнього класу, вам слід поставити внутрішній перед класом

class MyActivity : MainActivity() {
    // Call from class itself
    val builder = MaterialDialog.Builder(this@MyActivity) 

    inner class Inner {
        this@MyActivity // Call from the inner class 
    }
}

@Allen ви маєте рацію, для доступу до внутрішнього класу
потрібне

0

Так само, як ви робите в Java для отримання контексту діяльності як MainActivtiy.this, в kotlin ви отримаєте контекст як цей @ MainActivity


ви додаєте цей коментар для чого? Чи можете ви дати якісь вирішені посилання? Це буде нам корисно, так що ми будемо слідувати за ним наступного разу
Бала

0

getActivity()еквівалент є this@activity_name у випадку будівельника для матеріалуDialog

materialDialog = MaterialDialog.Builder(this)

0

Ви можете отримати такий предмет діяльності, як цей.

class DemoActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@DemoActivity)
}

0

У Котліні потрібно використовувати такий спосіб:

це @ ActivityName

Наприклад: Ви повинні використовувати його, якщо ви хочете визначити "Контекст" в MainActivity.kt

var mContext:Context = this@MainActivity

Чому? Тому що в мові Котліна @ є значення "of", такі як:

val a = this@A // A's this

Якщо ви хочете дізнатися більше інформації, ви можете подивитися веб-сайт Kotlin Language: Цей вираз у Котліні

@canerkaseler

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.