Comment accéder à «Activity.this» dans Kotlin?

130

J'ai ce morceau de code Java:

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

Je veux obtenir l'objet MainActivity dans Kotlin. La conversion automatique s'arrête à MainActivity.this.

Bal0r
la source
Peut this as MainActivity- être ?
Marc Plano-Lesay
1
Et si ce code n'est pas à l'intérieur MainActivity, à quelle instance de MainActivityest-il connecté (et comment)? À quelle instance souhaitez-vous accéder this?
raccourci clavier du
Le code Java fonctionnel fait uniquement référence à l'activité. Ceci, donc un code statique? Je n'en suis pas sûr.
Bal0r
Le code Java de travail est-il également dans un fichier complètement séparé?
yole
Comment est ce code appelé, sinon , MainActivitymais encore coulée thisà MainActivity? Dans une sous-classe peut-être?
Marc Plano-Lesay

Réponses:

239

Vous pouvez obtenir une référence à votre MainActivityobjet dans Kotlin en utilisant un fichier qualifiéthis . par exemple:

class MyActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@MyActivity)
}
mfulton26
la source
1
Et le fragment? J'ai injecté du contexte dans le fragment (avec @ActivityContextattribut), maintenant j'ai besoin d'activité. Bien sûr, je connais getActivity()(Kotlin activity) dans le Fragment, mais est-ce que la deuxième façon est correcte ou parce que j'ai du contexte, il vaut mieux l'utiliser pour accéder à l'activité?
Dr.jacky
@ Dr.jacky Je pense que vous pouvez faire le casting de '(contexte comme? YourActivity)'. Maintenant, vous pouvez accéder à vos méthodes d'activité
Gian Gomen
@ siddarth-g si vous rencontrez un problème avec des références non résolues, je vous recommande de créer une nouvelle question avec un MCVE pour obtenir de l'aide.
mfulton26
@ mfulton26 ce n'est pas un problème de compilation, ce @ ActivityName ne fonctionnait pas non plus pour moi dans un autre projet.
Siddarth G le
18

Essayez plutôt cette étiquette

this@YourActivityName
Le Bala
la source
1
référence unresolevd
Siddarth G
Il ne compile pas
IgorGanapolsky
2
@IgorGanapolsky change le ActivityName en votre nom d'activité -_-
Grecha
1

Si vous appelez Activity.this depuis une classe interne, vous devez mettre interne avant la 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
la source
@Allen vous avez raison, un mot-clé interne est requis pour accéder à l'activité à l'intérieur de la classe interne
droidev
0

Tout comme vous le faites en java pour obtenir le contexte de l'activité en tant que MainActivtiy.this, dans kotlin, vous obtiendrez le contexte sous la forme @ MainActivity

Shivam Yadav
la source
vous ajoutez ces commentaires pour quoi? Pouvez-vous donner une référence résolue? Cela nous sera utile, pour que nous le suivions à partir de la prochaine fois
The Bala
0

getActivity()l'équivalent est this@activity_name dans le cas du constructeur pour materialDialog

materialDialog = MaterialDialog.Builder(this)
Mechadroid
la source
0

Vous pouvez obtenir l'objet de l'activité comme ceci.

class DemoActivity : MainActivity() {
    val builder = MaterialDialog.Builder(this@DemoActivity)
}
Nikhil Katekhaye
la source
0

Dans Kotlin, vous devez utiliser cette méthode:

this @ ActivityName

Par exemple: vous devez l'utiliser si vous souhaitez définir "Contexte" dans MainActivity.kt

var mContext:Context = this@MainActivity

Pourquoi? Parce qu'en langage Kotlin, @ signifie "de" tel que:

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

Si vous souhaitez en savoir plus, vous pouvez consulter le site Web de Kotlin Language: This Expression in Kotlin

@canerkaseler

canerkaseler
la source