¿Cómo acceder a "Activity.this" en Kotlin?


130

Tengo esta pieza de código Java:

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

Quiero obtener el objeto MainActivity en Kotlin. La conversión automática se interrumpe en MainActivity.this.


this as MainActivity¿ Quizás ?
— Marc Plano-Lesay

1
Y si este código no está dentro MainActivity, ¿a qué instancia de MainActivityestá conectado (y cómo)? ¿Con qué instancia quieres acceder this?
— tecla

El código de trabajo de Java hace referencia solo a la actividad. ¿Esto, entonces es estático? Aunque no estoy seguro.
— Bal0r

¿El código Java de trabajo también está en un archivo completamente separado?
— yole

¿Cómo se llama este código, si no está en MainActivitypero aún se está enviando thisa MainActivity? ¿Quizás en una subclase?
— Marc Plano-Lesay

Respuestas:


239

Puede obtener una referencia a su MainActivityobjeto en Kotlin utilizando un archivothis . p.ej:

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

1
¿Qué tal Fragmento? He inyectado Contexto en Fragmento (con @ActivityContextatributo), ahora necesito Actividad. Por supuesto, conozco getActivity()(Kotlin activity) en el Fragmento, pero ¿está bien la segunda forma o porque tengo Contexto, es mejor usarlo para acceder a la actividad?
— Dr.jacky

@ Dr.jacky Creo que puedes hacer el elenco de '(contexto como? Tu actividad)'. Ahora puede acceder a sus métodos de actividad
— Gian Gomen

@ siddarth-g, si tiene un problema con referencias no resueltas, le recomiendo crear una nueva pregunta con un MCVE para obtener ayuda.
— mfulton26

@ mfulton26 no es un problema de compilación, este @ ActivityName tampoco funcionó para mí en otro proyecto.
— Siddarth G


1

Si está llamando a Activity.this desde una clase interna, debe poner inner antes de la clase

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

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

@Allen, tiene razón, se requiere una palabra clave interna para acceder a la actividad dentro de la clase interna
— droidev

0

Al igual que lo hace en java para obtener el contexto de actividad como MainActivtiy.this, en kotlin obtendrá el contexto como this @ MainActivity


¿Estás agregando estos comentarios para qué? ¿Puede dar alguna referencia resuelta? Nos será de ayuda, para que lo sigamos desde la próxima vez
— The Bala

0

getActivity()equivalente es this@activity_name en caso de constructor para materialDialog

materialDialog = MaterialDialog.Builder(this)

0

Puede obtener el objeto de la actividad de esta manera.

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

0

En Kotlin, debes usar esta forma:

esto @ ActivityName

Por ejemplo: debe usarlo si desea definir "Contexto" en MainActivity.kt

var mContext:Context = this@MainActivity

¿Por qué? Porque en el lenguaje Kotlin @ tiene un significado "de" como:

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

Si desea obtener más información, puede buscar el sitio web de Kotlin Language: Esta expresión en Kotlin

@canerkaseler

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.