在android中无法使用dismiss方法解除Progress对话框

class CShowProgress(context: Context) { var s_m_oCShowProgress: CShowProgress? = null lateinit var m_Dialog: Dialog private var m_ProgressBar: ProgressBar? = null private var progressText: TextView? = null fun getInstance(): CShowProgress { if (s_m_oCShowProgress == null) { s_m_oCShowProgress = CShowProgress(context!!) } return s_m_oCShowProgress as CShowProgress } fun show(m_Context: Context, message: String) { m_Dialog = Dialog(m_Context) m_Dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) m_Dialog.setContentView(R.layout.progress_bar) m_ProgressBar = m_Dialog.findViewById(R.id.progressBar_cyclic) m_ProgressBar!!.visibility = View.VISIBLE m_ProgressBar!!.isIndeterminate = true m_Dialog.setCancelable(false) m_Dialog.setCanceledOnTouchOutside(false) m_Dialog.show() } fun dismiss(m_Context: Context) { m_Dialog = Dialog(m_Context) m_Dialog.dismiss() } } 

这是我的自定义进度对话框的显示对话框我们有显示方法和解雇我们已经dismiss方法我打电话给这个类

  CShowProgress(this).getInstance().show(this, "Please wait..") and for dismiss i am calling CShowProgress(this).getInstance().dismiss(this) 

使用显示我能够显示进度对话框,但使用dimiss我不能解雇任何人请告诉我我在做什么错我正在使用kotlin语言。

请试试这个

 class CShowProgress(context: Context) { var s_m_oCShowProgress: CShowProgress? = null lateinit var m_Dialog: Dialog private var m_ProgressBar: ProgressBar? = null private var progressText: TextView? = null fun getInstance(): CShowProgress { if (s_m_oCShowProgress == null) { s_m_oCShowProgress = CShowProgress(context!!) } return s_m_oCShowProgress as CShowProgress } fun show(m_Context: Context, message: String) { m_Dialog = Dialog(m_Context) m_Dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) m_Dialog.setContentView(R.layout.progress_bar) m_ProgressBar = m_Dialog.findViewById(R.id.progressBar_cyclic) m_ProgressBar!!.visibility = View.VISIBLE m_ProgressBar!!.isIndeterminate = true m_Dialog.setCancelable(false) m_Dialog.setCanceledOnTouchOutside(false) m_Dialog.show() } fun dismiss() { //no need to re initialise dialog only check for if the dialog is showing if(m_Dialog.isShowing){ m_Dialog.dismiss() } } } 

在你的活动中为这个类创建一个对象,并像这样使用show和dismiss方法

  val dialoge:CShowProgress = CShowProgress(this)//create object for the class dialoge.show(this,"Your message")//for showing the dialog dialoge.dismiss()//to dismiss the dialog 

当你打电话给你的时候,你会创建一个新的未显示的对话框并试图解除它。

在这里我修改了你的解雇function。 我想这会帮助你

 fun dismiss() { if(m_Dialog.isShowing){ m_Dialog.dismiss() } } 

编辑:

哦,对不起,我没有检查你的单身模式。 当你调用CShowProgress(this)你创建了一个新的类实例,所以你不能忽略以前的对话框。

你可以像下面这样创建一个Singleton

 companion object { lateinit var instance: CShowProgress private set } 

和这样的init:

 instance = CShowProgress(context) 

并使用这样的显示对话框:

 CShowProgress.instance.show(context,message) 

像这样变暗:

 CShowProgress.instance.dismiss() 

但是我认为,如果你重构这样的代码,你仍然会遇到另一个我在下面解释的问题。

另外当你显示一个新的对话框时,你会忽略对旧对话框的引用,所以你不能忽略它。 基本上,你正在创建一个对话框,但只持有你最后创建的对话框的引用。 所以你不能排除以前的。 所以如果你继续这样下去,你可以在显示一个新的对话框之前解除以前的对话框。 但是这种模式很难管理多个警报对话框,所以我建议你改变它。

 fun show(m_Context: Context, message: String) { if(m_Dialog.isShowing){ m_Dialog.dismiss() } m_Dialog = Dialog(m_Context) m_Dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) m_Dialog.setContentView(R.layout.progress_bar) m_ProgressBar = m_Dialog.findViewById(R.id.progressBar_cyclic) m_ProgressBar!!.visibility = View.VISIBLE m_ProgressBar!!.isIndeterminate = true m_Dialog.setCancelable(false) m_Dialog.setCanceledOnTouchOutside(false) m_Dialog.show() } 

最后将Activity context传递给一个单例对象,并且不清除活动onDestroy何时会导致内存泄漏。