Jak uzyskać dostęp do „Activity.this” w Kotlinie?

130

Mam ten fragment kodu Java:

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

Chcę uzyskać obiekt MainActivity w Kotlinie. Automatyczna konwersja kończy się o godzinie MainActivity.this.

Bal0r
źródło
Może this as MainActivity?
Marc Plano-Lesay
1
A jeśli tego kodu nie ma w środku MainActivity, to z którą instancją MainActivityjest on połączony (i jak)? Do której instancji chcesz uzyskać dostęp this?
skrót klawiszowy
Działający kod Java odwołuje się tylko do działania. To, więc statyczny? Nie jestem pewien.
Bal0r
Czy działający kod Java również znajduje się w całkowicie oddzielnym pliku?
yole
Jak nazywa się ten kod, jeśli nie w MainActivityale nadal rzucając thissię MainActivity? Może w podklasie?
Marc Plano-Lesay

Odpowiedzi:

239

Możesz uzyskać odniesienie do swojego MainActivityobiektu w Kotlinie, używając Qualifiedthis . na przykład:

class MyActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@MyActivity)
}
mfulton26
źródło
1
A co z Fragmentem? Wstawiłem Context do fragmentu (z @ActivityContextatrybutem), teraz potrzebuję Aktywności. Oczywiście wiem o getActivity()(Kotlinie activity) we fragmencie, ale czy drugi sposób jest w porządku, czy ponieważ mam Context, lepiej go użyć, aby uzyskać dostęp do aktywności?
Dr Jacky
@ Dr.jacky Myślę, że możesz zrobić obsadę „(kontekst jako? YourActivity)”. Teraz możesz uzyskać dostęp do swoich metod aktywności
Gian Gomen,
@ siddarth-g, jeśli masz problem z nierozwiązanymi odwołaniami, zalecamy utworzenie nowego pytania z MCVE, aby uzyskać pomoc.
mfulton26
@ mfulton26 to problem z brakiem kompilacji ten @ ActivityName nie działa również dla mnie w innym projekcie.
Siddarth G
18

Zamiast tego wypróbuj tę etykietę

this@YourActivityName
Bala
źródło
1
nierozstrzygnięte odniesienie
Siddarth G
To się nie kompiluje
IgorGanapolsky
2
@IgorGanapolsky zmień ActivityName na swoją nazwę aktywności -_-
Grecha
1

Jeśli wywołujesz Activity.this z klasy wewnętrznej, musisz umieścić wewnętrzną przed klasą

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

    inner class Inner {
        this@MyActivity // Call from the inner class 
    }
}
Allen
źródło
@Allen, masz rację, wewnętrzne słowo kluczowe jest wymagane, aby uzyskać dostęp do działania w klasie wewnętrznej
droidev
0

Tak jak w Javie, aby uzyskać kontekst działania jako MainActivtiy. Tak, w kotlin otrzymasz kontekst jako @ MainActivity

Shivam Yadav
źródło
czy dodajesz te komentarze do czego? Czy możesz podać jakieś rozwiązane odniesienie? Będzie nam to pomocne, abyśmy podążali za nim od następnego razu
Bala
0

getActivity()odpowiednik jest this@activity_name w przypadku konstruktora dla materialDialog

materialDialog = MaterialDialog.Builder(this)
Mechadroid
źródło
0

Możesz dostać przedmiot takiej działalności.

class DemoActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@DemoActivity)
}
Nikhil Katekhaye
źródło
0

W Kotlinie musisz użyć w ten sposób:

this @ ActivityName

Na przykład: Powinieneś go użyć, jeśli chcesz zdefiniować „Context” w MainActivity.kt

var mContext:Context = this@MainActivity

Czemu? Ponieważ w języku Kotlin @ oznacza „z”, na przykład:

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

Jeśli chcesz dowiedzieć się więcej informacji, zajrzyj na stronę internetową języka Kotlin: To wyrażenie w Kotlinie

@canerkaseler

canerkaseler
źródło