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.


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)
}

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


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, 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


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)

0

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.