Як отримати доступ до "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.