如何从按钮单击kotlin调用函数

How to call a function from button click kotlin

我有两个活动,LoginActivityMainActivity。当我按下 LoginActivity 中的按钮时,我想调用 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)
    }

请给我一个合适的解决方案。谢谢

在 Kotlin 中有 3 种方法:

  1. Using Object - 因为它是一个静态函数,不访问对象的视图或数据 MainActivity,可以通过object的方式调用 MainActivity 因为它不必是 运行 实例。

    因此,您可以将其称为 MainActivity().triggerRestart()

  2. 使用伴随对象 - 您也可以在 Comapnion 中声明函数 MainActivity 的对象为

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

    然后可以作为MainActivity.triggerRestart()访问它。

  3. 从伴随对象获取实例 - 您可以获得 MainActivity 的实例,然后可以通过它访问该函数:

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

    然后可以作为 MainActivity.instance.triggerRestart().

    访问它

第一种和第二种之间的区别在于,您不必以第二种方式不必要地创建 MainActivity 的对象来访问静态函数。

第二个和第三个之间的区别在于第三个,您正在通过 activity 本身传递的 activity 实例访问该函数,这对于静态值是不必要的,但在您想要的情况下很重要访问 MainActivity.

运行 实例的 views/values

您可以进一步改进第三种方式,以确保它只传递 运行 实例而不传递新实例。为此,创建一个私有临时变量并在 class 的 init() 中将其初始化为 this(这意味着 Activity),并将其作为 instance 传递。这样,third 将传递 activity.

的 运行 实例

您可以使用附加功能将数据从一个 activity 传递到另一个。例如,您可以通过这样做在第一个 activity 中设置一些标志:

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

然后在第二个Activity的onCreate中接收flag,如果传入true则调用方法:

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

但是,您不应该首先调用 Runtime.getRuntime().exit(0)。您可以通过重新创建 Activity 来清除应用程序状态。也不需要强制转换为 activity class,因为您已经将 activity 实例传递给方法:

fun triggerRestart(context: Activity)

所以上下文对象是 Activity 的实例,没有理由检查和转换它。而不是这个:

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

直接打电话

activity.finish()