如何从 Activity class 传递 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() 函数中传递 Class关闭调用activity.

我的简单问题是如何恢复它?或者我如何将此函数 (finish()) 传递给不同的 class (在其他文件中)。

在您的方法中采用函数类型参数。

fun doBackPress(finish: () -> Unit) {
    // you need to invoke the finish method when necessary
    finish.invoke()
}

然后您需要调用该方法,并且必须从任何其他 activity 或下面的片段方法传递 finish() 方法。

override fun onBackPressed() {
    doBackPress { finish() }
}

你可以创建一个接口和扩展函数,我认为这比尝试将你需要的所有东西作为参数传递给一个函数要简单得多,因为它可以更好地传达意图并且更难做错事。

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 应该实现该接口,使用 dialogtwoBtnDialog 的现有属性(只需在它们的声明前添加 override)。

我假设 twoBtnDialog 是视图绑定。