如何从按钮单击kotlin调用函数
How to call a function from button click kotlin
我有两个活动,LoginActivity
和 MainActivity
。当我按下 LoginActivity
中的按钮时,我想调用 MainActivity
中的函数。我该如何实现?
- 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 种方法:
Using Object - 因为它是一个静态函数,不访问对象的视图或数据
MainActivity
,可以通过object
的方式调用
MainActivity
因为它不必是 运行 实例。
因此,您可以将其称为 MainActivity().triggerRestart()
。
使用伴随对象 - 您也可以在 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()
访问它。
从伴随对象获取实例 - 您可以获得 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()
我有两个活动,LoginActivity
和 MainActivity
。当我按下 LoginActivity
中的按钮时,我想调用 MainActivity
中的函数。我该如何实现?
- 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 种方法:
Using Object - 因为它是一个静态函数,不访问对象的视图或数据
MainActivity
,可以通过object
的方式调用MainActivity
因为它不必是 运行 实例。因此,您可以将其称为
MainActivity().triggerRestart()
。使用伴随对象 - 您也可以在 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()
访问它。从伴随对象获取实例 - 您可以获得 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
.
您可以进一步改进第三种方式,以确保它只传递 运行 实例而不传递新实例。为此,创建一个私有临时变量并在 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()