android - 在自定义对话框dismiss() 之后调用finish() 时,Android 活动崩溃
问题描述
对于 Kotlin,我使用的是自定义对话框类。活动需要关闭才能返回上一个活动,并在对话框中调用finish()
活动。onClick()
简化的自定义对话框
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()
}
}
推荐阅读
- bash - 提供动态模式 (YYYYMMDD) 作为 ftp mget 模式
- ruby-on-rails - 无法在 WSL Ubuntu 18 上运行 Rails 系统测试
- perl - 在安装 conda 包期间更新 @INC 变量
- json - 将列表添加到 Cloudformation 模板的参数文件
- appkit - SwiftUI 按钮到选择器操作
- r - 将一个矩阵中的值替换为另一个矩阵中的值
- python - SyntaxError:我编写 docker 容器时语法无效,但应用程序在没有 docker 的情况下工作正常
- php - 如何通过php中的数据库调用检查变量中的字符存在
- parallel-processing - DSP 中的零开销循环
- macos - 如何查看在解析 @rpath 对库的引用时搜索的应用程序中嵌入的位置列表?