如何将 Activity 类中的 finish() 作为函数参数传递(以便代码可以在 Kotlin 中重用)?

How to Pass finish() from Activity class as a function parameter (So the code can be reused in Kotlin)?

提问人:Haris 提问时间:7/7/2021 更新时间:7/8/2021 访问量:305

问:

我必须在两个不同的地方,在两个不同的活动中使用这段代码两次。没有一个好的程序员愿意在多个地方使用相同的代码而不重用它。

//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())传递给不同的类(在其他一些文件中)。

Android Kotlin 参数传递

评论


答:

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 的现有属性(只需在其声明前面添加)。dialogtwoBtnDialogoverride

我假设是一个视图绑定。twoBtnDialog

评论

0赞 Haris 7/8/2021
我用 Arif 的答案让它工作。但是你的答案和更简单明了,所以让我试试。