Come accedere a "Activity.this" in Kotlin?


129

Ho questo pezzo di codice Java:

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

Voglio ottenere l'oggetto MainActivity in Kotlin. La conversione automatica si interrompe a MainActivity.this.


Forse this as MainActivity?
Marc Plano-Lesay

1
E se questo codice non è all'interno MainActivity, a quale istanza MainActivityè connesso (e come)? A quale istanza desideri accedere this?
hotkey

Il codice Java funzionante fa riferimento solo a activity.this, quindi statico? Non ne sono sicuro.
Bal0r

Anche il codice Java funzionante si trova in un file completamente separato?
yole

Come è questo codice di chiamata, se non in MainActivity, ma ancora colata thisa MainActivity? Forse in una sottoclasse?
Marc Plano-Lesay

Risposte:


238

È possibile ottenere un riferimento al vostro MainActivityoggetto in Kotlin utilizzando un qualificatothis . per esempio:

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

1
Che ne dici di Fragment? Ho inserito Context in Fragment (con @ActivityContextattributo), ora ho bisogno di Activity. Certo, conosco getActivity()(Kotlin activity) nel frammento, ma il secondo modo va bene o perché ho il contesto, è meglio usarlo per accedere all'attività?
Dr.jacky

@ Dr.jacky Penso che tu possa fare il cast di '(context as? YourActivity)'. Ora puoi accedere ai tuoi metodi di attività
Gian Gomen

@ siddarth-g se hai un problema con riferimenti irrisolti, ti consiglio di creare una nuova domanda con un MCVE per ottenere aiuto.
mfulton26

@ mfulton26 non è un problema di compilazione questo @ ActivityName non ha funzionato anche per me in un altro progetto.
Siddarth G,


1

Se stai chiamando Activity.this da una classe interna, devi mettere inner prima della classe

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

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

@Allen hai ragione, la parola chiave interna è necessaria per accedere all'attività all'interno della classe interna
droidev

0

Proprio come fai in java per ottenere il contesto dell'attività come MainActivtiy.this, in kotlin otterrai il contesto come @ MainActivity


stai aggiungendo questi commenti per cosa? Puoi dare qualche riferimento risoluto? Ci sarà utile, in modo che lo seguiremo dalla prossima volta
The Bala

0

getActivity()l'equivalente è this@activity_name in caso di builder per materialDialog

materialDialog = MaterialDialog.Builder(this)

0

Puoi ottenere l'oggetto dell'attività in questo modo.

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

0

In Kotlin, devi usare in questo modo:

questo @ activityName

Ad esempio: dovresti usarlo se desideri definire "Context" in MainActivity.kt

var mContext:Context = this@MainActivity

Perché? Perché nella lingua Kotlin @ ha un significato "di" come:

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

Se desideri saperne di più, puoi guardare il sito web di Kotlin Language: This Expression in Kotlin

@canerkaseler

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.