提问人:Haris 提问时间:7/7/2021 更新时间:7/8/2021 访问量:305
如何将 Activity 类中的 finish() 作为函数参数传递(以便代码可以在 Kotlin 中重用)?
How to Pass finish() from Activity class as a function parameter (So the code can be reused in Kotlin)?
问:
我必须在两个不同的地方,在两个不同的活动中使用这段代码两次。没有一个好的程序员愿意在多个地方使用相同的代码而不重用它。
//when back key is pressed
override fun onBackPressed() {
dialog.setContentView(twoBtnDialog.root)
twoBtnDialog.title.text = getString(R.string.warning)
twoBtnDialog.msgDialog.text = getString(R.string.backPressWarning)
twoBtnDialog.ok.text = getString(R.string.exit)
twoBtnDialog.cancel.text = getString(R.string.cancel)
twoBtnDialog.ok.setOnClickListener {
//do nav back
finish()
dialog.dismiss()
}
twoBtnDialog.cancel.setOnClickListener {
dialog.dismiss() //just do nothing
}
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.show()
}
我可以将它移动到一个地方,但问题是我必须从 Activity 类传入 finish() 函数才能关闭调用活动。
我的简单问题是我怎样才能恢复它?或者我怎样才能将这个函数(finish())传递给不同的类(在其他一些文件中)。
答:
1赞
ARiF
7/7/2021
#1
在方法中采用函数类型参数。
fun doBackPress(finish: () -> Unit) {
// you need to invoke the finish method when necessary
finish.invoke()
}
然后,您需要调用该方法,并且必须从任何其他活动或片段方法(如以下)传递该方法。finish()
override fun onBackPressed() {
doBackPress { finish() }
}
评论
0赞
Haris
7/8/2021
似乎它会起作用,但是有一个问题,我还必须传入两个BtnDialog变量,并且在使用此方法时找不到这样做的方法。
0赞
ARiF
7/8/2021
您可以在按钮的单击侦听器上调用该方法。如果要将其传递给对话框,则需要一个 setter 或构造函数将该方法作为参数传递twoBtnDialog
0赞
Tenfour04
7/8/2021
#2
你可以制作一个接口和扩展函数,我认为这比尝试将你需要的所有东西作为参数传递给函数要少得多,因为它可以更好地传达意图,并且更难做错事。
interface MyDialogOwner {
val dialog: Dialog
val twoBtnDialog: MyDialogBinding
fun Activity.handleBackPress() {
//the exact same content you have in your function now.
}
}
// In Activity:
override fun onBackPressed() = handleBackPress()
您的 Activity 应实现接口,使用 and 的现有属性(只需在其声明前面添加)。dialog
twoBtnDialog
override
我假设是一个视图绑定。twoBtnDialog
评论
0赞
Haris
7/8/2021
我用 Arif 的答案让它工作。但是你的答案和更简单明了,所以让我试试。
评论