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


130

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

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

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


Может быть 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)
}

1
Как насчет фрагмента? Я ввел контекст во фрагмент (с @ActivityContextатрибутом), теперь мне нужна активность. Конечно, я знаю о getActivity()(Котлине activity) во фрагменте, но подходит ли второй способ или из-за того, что у меня есть контекст, лучше использовать его для доступа к активности?
Доктор Джеки

@ Доктор Джеки Я думаю, вы можете использовать актерский состав '(в контексте? YourActivity)'. Теперь вы можете получить доступ к своим методам активности
Джан Гомен,

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

@ mfulton26 это не проблема компиляции, это @ ActivityName не сработало для меня и в другом проекте.
Siddarth G,


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)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.