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