Android: cómo llamar a una función desde un botón, haga clic en Kotlin

CorePress2024-01-25  12

Tengo dos actividades, LoginActivity y MainActivity. Cuando presiono un botón en mi LoginActivity quiero llamar a una función en MainActivity. ¿Cómo puedo lograr esto?

Función de actividad principal*
    fun triggerRestart(context: Activity) {
        val intent = Intent(context, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
        if (context is Activity) {
            (context as Activity).finish()
        }
        Runtime.getRuntime().exit(0)
    }

Por favor, dame una solución adecuada. Gracias

Las actividades no deben comunicarse entre sí, cada actividad se considera su propio punto de entrada independiente. ¿Hay alguna razón por la que no puedes ejecutar la función en la actividad de inicio de sesión?

-Shawn

28 de marzo de 2021 a las 8:30

@Shawn, Es una práctica común almacenar funciones estáticas que no acceden a nada de la actividad particular en la que están declaradas, sino que solo están relacionadas con ella en su objeto complementario, por lo que se pueden volver a crear. utilizado a través de otras actividades en lugar de reescribirlo en las actividades en las que se utiliza. Aunque el OP también puede usar la función de extensión en Actividad, no hay nada malo en la forma en que se usa actualmente. Porque, en este caso particular, si MainActivity se está ejecutando o no, no importa y no puede causar un error de tiempo de ejecución. Esto se hace para simplificar el código y facilitar su comprensión.

- Lalit Fauzdar

28/03/2021 a las 9:50

@Shawn Quiero ejecutar una función para borrar los datos de la aplicación y la función que estoy ejecutando hace que se cierre mi aplicación después de borrar los datos de la aplicación. por eso quiero reiniciarlo. Entonces creo que no es posible reiniciar la aplicación con una sola actividad.

- Elizabeth Harper

28/03/2021 a las 10:13



------------------------------------

Puedes pasar datos de una actividad a otra usando extras. Por ejemplo, puedes establecer alguna bandera en la primera actividad haciendo esto:

val intent = Intent(this, MainActivity::class.java)
intent.putExtra("SOME_KEY", true)
startActivity(intent)

Luego reciba la bandera en onCreate de la segunda actividad y llame al método si se pasa la bandera verdadera:

val flag = intent.getBooleanExtra("SOME_KEY", false)
if (flag) {
  //call method in second Activity
}

Sin embargo, no deberías llamar a Runtime.getRuntime().exit(0) en primer lugar. Puede borrar el estado de la aplicación simplemente recreando la Actividad. Además, la conversión a la clase de actividad no es necesaria, porque ya pasas la instancia de actividad al método:

fun triggerRestart(context: Activity)

Entonces el objeto de contexto es una instancia de Actividad y no hay razón para verificarlo y emitirlo. En lugar de esto:

if (context is Activity) {
  (context as Activity).finish()
}

solo llama

activity.finish()

1

Tu respuesta es excelente y fácil de entender, gracias por tu contribución.

- Elizabeth Harper

28/03/2021 a las 17:13



------------------------------------

Hay 3 formas de hacerlo en Kotlin:

Uso de objetos: como es una función estática que no accede a vistas o datos de MainActivity, puedes llamarlo a través de un objeto de MainActivity ya que no necesita ser la instancia en ejecución.

Entonces, puedes llamarlo MainActivity().triggerRestart().

Uso del objeto complementario: también puede declarar la función en Comapnion Objeto de MainActivity como

Companion object {
    fun triggerRestart(context: Activity) {
        val intent = Intent(context, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
        if (context is Activity) {
            (context as Activity).finish()
        }
        Runtime.getRuntime().exit(0)
    }
}

Y luego puede acceder a él como MainActivity.triggerRestart().

Obtener una instancia del objeto complementario: puede obtener una instancia de MainActivity y luego acceder a la función a través de ella como:

Companion object {
    val instance = MainActivity()

}

fun triggerRestart(context: Activity) {
    val intent = Intent(context, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(intent)
    if (context is Activity) {
        (context as Activity).finish()
    }
    Runtime.getRuntime().exit(0)
}

y luego puede acceder a él como MainActivity.instance.triggerRestart().

La diferencia entre el primero y el segundo es que no es necesario crear innecesariamente un objeto de MainActivity en el segundo modo para acceder a una función estática.

La diferencia entre segundo y tercero está en tercero, estás accediendo a la función a través de una instancia de actividad pasada por la actividad misma, innecesario para valores estáticos pero importante en caso de que quieras acceder a las vistas/valores de running instancia de MainActivity.

Puede mejorar aún más la tercera forma para asegurarse de que pase solo la instancia en ejecución y no la instancia nueva. Para eso, cree una var temporal privada e inicialícela como this (que significa Actividad) en init() de la clase y pásela como instancia. De esta manera, el tercero pasará la instancia en ejecución de la actividad.

1

Gracias, logré aplicar tu solución y funciona.

- Elizabeth Harper

28 de marzo de2021 a las 17:14

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare