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.


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

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


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


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)

0

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.