Как получить доступ к Activity.this в Котлине?

130

У меня есть этот фрагмент кода Java:

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

Я хочу получить объект MainActivity в Котлине. Автоматическое преобразование прерывается при MainActivity.this.

Bal0r
источник
Может быть this as MainActivity?
Марк Плано-Лесай
1
А если этого кода нет внутри MainActivity, то к какому экземпляру MainActivityон подключен (и как)? К какому экземпляру вы хотите получить доступ this?
горячая клавиша
Рабочий код Java ссылается только на activity. This, так что статический? Я не уверен в этом.
Bal0r
Рабочий код Java тоже находится в отдельном файле?
yole
Как этот код называется, если не в , MainActivityно все еще литье thisв MainActivity? Может быть, в подклассе?
Марк Плано-Лесай,

Ответы:

239

Вы можете получить ссылку на свой MainActivityобъект в Kotlin, используя квалифицированныйthis . например:

class MyActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@MyActivity)
}
mfulton26
источник
1
Как насчет фрагмента? Я ввел контекст во фрагмент (с @ActivityContextатрибутом), теперь мне нужна активность. Конечно, я знаю о getActivity()(Котлине activity) во фрагменте, но подходит ли второй способ или из-за того, что у меня есть контекст, лучше использовать его для доступа к активности?
Доктор Джеки
@ Доктор Джеки Я думаю, вы можете использовать актерский состав '(в контексте? YourActivity)'. Теперь вы можете получить доступ к своим методам активности
Джан Гомен,
@ siddarth-g, если у вас возникла проблема с неразрешенными ссылками, я рекомендую создать новый вопрос с MCVE, чтобы получить помощь.
mfulton26
@ mfulton26 это не проблема компиляции, это @ ActivityName не сработало для меня и в другом проекте.
Siddarth G,
18

Попробуйте вместо этого этот ярлык

this@YourActivityName
Бала
источник
1
неопубликованная ссылка
Siddarth G
Не компилируется
Игорь Ганапольский
2
@IgorGanapolsky измените ActivityName на ваше Activity name -_-
Grecha
1

Если вы вызываете Activity.this из внутреннего класса, вы должны поместить inner перед классом

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

    inner class Inner {
        this@MyActivity // Call from the inner class 
    }
}
Аллен
источник
@Allen, вы правы, для доступа к Activity внутри внутреннего класса требуется ключевое слово inner
droidev
0

Так же, как в java для получения контекста активности как MainActivtiy. Это, в kotlin вы получите контекст как этот @ MainActivity

Шивам Ядав
источник
вы добавляете эти комментарии для чего? Можете дать какую-нибудь решенную ссылку? Это поможет нам, так что мы будем следить за ним в следующий раз
Бала
0

getActivity()эквивалент this@activity_name в случае конструктора для materialDialog

materialDialog = MaterialDialog.Builder(this)
Mechadroid
источник
0

Вы можете получить объект деятельности вот так.

class DemoActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@DemoActivity)
}
Нихил Катехайе
источник
0

В Kotlin вы должны использовать такой способ:

это @ ActivityName

Например: вам следует использовать его, если вы хотите определить «Контекст» в MainActivity.kt

var mContext:Context = this@MainActivity

Зачем? Потому что в языке Котлин @ имеет значение "из", например:

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

Если вы хотите узнать больше, вы можете посетить веб-сайт языка Kotlin: Это выражение в Kotlin

@canerkaseler

canerkaseler
источник