Wie greife ich in Kotlin auf "Activity.this" zu?


128

Ich habe diesen Java-Code:

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

Ich möchte das MainActivity-Objekt in Kotlin erhalten. Die automatische Konvertierung wird bei unterbrochen MainActivity.this.


Vielleicht this as MainActivity?
Marc Plano-Lesay

1
Und wenn dieser Code nicht enthalten ist MainActivity, mit welcher Instanz MainActivityist er dann verbunden (und wie)? Auf welche Instanz möchten Sie zugreifen this?
Hotkey

Der funktionierende Java-Code verweist nur auf die Aktivität. Dies ist also eine statische? Ich bin mir nicht sicher.
Bal0r

Befindet sich der funktionierende Java-Code auch in einer vollständig separaten Datei?
Yole

Wie wird dieser Code aufgerufen, wenn nicht in , MainActivityaber immer noch Gießen thiszu MainActivity? In einer Unterklasse vielleicht?
Marc Plano-Lesay

Antworten:


236

Sie können einen Verweis auf Ihr MainActivityObjekt in Kotlin erhalten, indem Sie einen qualifizierten verwendenthis . z.B:

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

1
Wie wäre es mit Fragment? Ich habe Context in Fragment (mit @ActivityContextAttribut) eingefügt, jetzt brauche ich Aktivität. Natürlich weiß ich über getActivity()(Kotlin activity) im Fragment Bescheid , aber ist der zweite Weg in Ordnung oder weil ich Kontext habe, ist es besser, ihn für den Zugriff auf die Aktivität zu verwenden?
Dr. Jacky

@ Dr.jacky Ich denke du kannst '(Kontext als? YourActivity)' besetzen. Jetzt können Sie auf Ihre Aktivitätsmethoden zugreifen
Gian Gomen

@ siddarth-g Wenn Sie ein Problem mit ungelösten Referenzen haben, empfehle ich, eine neue Frage mit einem MCVE zu erstellen , um Hilfe zu erhalten.
mfulton26

@ mfulton26 Es ist kein Kompilierungsproblem. Dieser @ ActivityName hat bei mir auch in einem anderen Projekt nicht funktioniert.
Siddarth G


1

Wenn Sie Activity.this aus einer inneren Klasse aufrufen, müssen Sie inner vor die Klasse stellen

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

    inner class Inner {
        this@MyActivity // Call from the inner class 
    }
}

@Allen Sie sind richtig, inneres Schlüsselwort ist erforderlich, um auf die Aktivität innerhalb der inneren Klasse
zuzugreifen

0

Genau wie Sie es in Java tun, um den Kontext der Aktivität als MainActivtiy.this abzurufen, erhalten Sie in kotlin den Kontext als this @ MainActivity


Fügen Sie diese Kommentare für was hinzu? Können Sie eine entschlossene Referenz geben? Es wird uns hilfreich sein, damit wir es ab dem nächsten Mal verfolgen können
The Bala

0

getActivity()Äquivalent ist this@activity_name im Fall des Builders für materialDialog

materialDialog = MaterialDialog.Builder(this)

0

Sie können das Objekt der Aktivität wie folgt erhalten.

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

0

In Kotlin müssen Sie Folgendes verwenden:

this @ ActivityName

Beispiel: Sie sollten es verwenden, wenn Sie "Kontext" in MainActivity.kt definieren möchten

var mContext:Context = this@MainActivity

Warum? Weil in der Kotlin-Sprache @ "von" bedeutet wie:

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

Wenn Sie weitere Informationen erhalten möchten, besuchen Sie die Kotlin Language-Website: Dieser Ausdruck in Kotlin

@canerkaseler

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.