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.