Android activity 在自定义对话框 dismiss() 后调用 finish() 时崩溃
Android activity crushes when the finish() is called after custom dialog dismiss()
对于 Kotlin,我使用的是自定义对话框 class。在对话框的 onClick()
上调用 activity 的 finish()
需要将 activity 关闭到 return 之前的 activity。
简化的自定义对话框
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()
}
}
activity 将此对话框称为
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)
activity 正在扩展 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)
我也试过转换成 activity class。这也没有用。
我已经查看了这些 Q/As 1, 以及其他一些问题,但未能解决。
我该如何解决这个问题?
如果你查看父 class 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()
}
}
对于 Kotlin,我使用的是自定义对话框 class。在对话框的 onClick()
上调用 activity 的 finish()
需要将 activity 关闭到 return 之前的 activity。
简化的自定义对话框
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()
}
}
activity 将此对话框称为
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)
activity 正在扩展 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)
我也试过转换成 activity class。这也没有用。
我已经查看了这些 Q/As 1,
我该如何解决这个问题?
如果你查看父 class 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()
}
}