当自定义对话框 dismiss() 之后调用 finish() 时,Android 活动会崩溃



使用 Kotlin,我正在使用自定义对话框类。需要关闭活动才能返回上一个活动,并在对话框的onClick()调用活动的finish()

简化的自定义对话框

class TestDialog (context: Context) : Dialog(context),
View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_result_screen)

var yesButton=  findViewById(R.id.buttonControl);
yesButton.setOnClickListener(this);
}
override fun onClick(v: View) {
dismiss()
(context as AppCompatActivity).finish()
}
}

活动将此对话框调用为


val testDialog = TestDialog(this@TheDialogDisplayerActivity)
testDialog.show()
//used to dislay in full size of the secreen.
val window: Window? = testDialog.window
window?.setLayout(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT)

该活动正在扩展AppCompatActivity

调用finish()时,发生以下错误,我找不到解决方案。

java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to androidx.appcompat.app.AppCompatActivity
at com.xyz.widget.TestResultDialog.onClick(TestResultDialog.kt:67)

我也尝试过投射到活动类中。这也行不通。

我也看过这些Q/As 1、2和其他一些问题,但未能解决。

如何解决此问题?

如果您查看父类Dialog,则context变为:mContext = new ContextThemeWrapper(context, themeResId);- 这正是您稍后尝试将其转换回Activity时给您的错误。

你应该做:

class TestDialog (private val activity: Activity) : Dialog(activity),
View.OnClickListener {
...
override fun onClick(v: View) {
dismiss()
activity.finish()
}
}

最新更新