当自定义对话框disclosure()后调用finish()时,安卓活动会崩溃

问题描述 投票:0回答:1

在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)

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

我看了这些QA 1, 2以及其他一些问题,也未能解决。

如何解决这个问题?

android kotlin android-activity customdialog
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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.