Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从按钮单击kotlin调用函数_Android_Kotlin_Onclicklistener - Fatal编程技术网

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

Android 如何从按钮单击kotlin调用函数,android,kotlin,onclicklistener,Android,Kotlin,Onclicklistener,我有两个活动,LoginActivity和MainActivity。当我按下我的LoginActivity中的一个按钮时,我想调用MainActivity中的一个函数。我该如何实现这一点 主活动函数* 请给我一个合适的解决方案。谢谢在Kotlin有三种方法: 使用对象-因为它是一个静态函数,不访问对象的视图或数据 MainActivity,您可以通过的对象调用它 MainActivity,因为它不需要是正在运行的实例 因此,您可以将其称为MainActivity().triggerResta

我有两个活动,
LoginActivity
MainActivity
。当我按下我的
LoginActivity
中的一个按钮时,我想调用
MainActivity
中的一个函数。我该如何实现这一点

  • 主活动函数*

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

在Kotlin有三种方法:

  • 使用对象-因为它是一个静态函数,不访问对象的视图或数据
    MainActivity
    ,您可以通过的
    对象调用它
    
    MainActivity
    ,因为它不需要是正在运行的实例

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

  • 使用伴生对象-您还可以在Comapion中声明函数
    main活动的对象
    as

    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()
    访问它

  • 从同伴对象获取实例-您可以获取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
    的对象来访问静态函数

    第二个和第三个的区别在于第三个,您是通过活动本身传递的活动实例来访问函数的,对于静态值来说是不必要的,但是如果您想访问
    MainActivity
    running实例的视图/值,这一点很重要


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

    您可以使用extras将数据从一个活动传递到另一个活动。例如,您可以通过执行以下操作在第一个活动中设置一些标志:

    val intent = Intent(this, MainActivity::class.java)
    intent.putExtra("SOME_KEY", true)
    startActivity(intent)
    
    然后在onCreate of second Activity中接收标志,如果传递了true标志,则调用方法:

    val flag = intent.getBooleanExtra("SOME_KEY", false)
    if (flag) {
      //call method in second Activity
    }
    
    但是,您不应该首先调用Runtime.getRuntime().exit(0)。您只需重新创建活动即可清除应用程序状态。另外,不需要强制转换到activity类,因为您已经将activity实例传递给该方法:

    fun triggerRestart(context: Activity)
    
    所以上下文对象是活动的实例,没有理由检查和强制转换它。与此相反:

    if (context is Activity) {
      (context as Activity).finish()
    }
    
    就打电话

    activity.finish()
    

    活动不应该与每个人交谈,每个活动都考虑它自己的独立入口点。您不能在登录活动中运行该函数有什么原因吗?@Shawn,通常的做法是存储静态函数,这些函数不访问它在其中声明的特定活动的任何内容,但只在它的同伴对象中与其相关,因此它可以通过其他活动重新使用,而不是在它使用的活动中重新写入。虽然OP也可以在
    活动
    上使用扩展功能,但它当前的使用方式没有任何问题。因为在这种特殊情况下,
    MainActivity
    是否正在运行并不重要,也不会导致运行时错误。这样做是为了简化代码并使代码更容易理解。@Shawn我想运行
    函数来清除应用程序数据,而我正在运行的
    函数在清除应用程序数据后导致关闭我的应用程序。这就是我想重新启动它的原因。因此,我认为不可能用一个
    活动
    重新启动应用程序。感谢您的贡献,您的答案很好,也很容易理解。谢谢,我成功地应用了您的解决方案,并且效果良好。
    activity.finish()