无法在android中使用Disclose方法关闭进度对话框

无法在android中使用Disclose方法关闭进度对话框,android,kotlin,progressdialog,Android,Kotlin,Progressdialog,这是我的singlton类,用于自定义进度对话框,用于show对话框,我们有show方法,用于Disclose,我们有Disclose方法,我调用这个类 class CShowProgress(context: Context) { var s_m_oCShowProgress: CShowProgress? = null lateinit var m_Dialog: Dialog private var m_ProgressBar: ProgressBar? = nul

这是我的singlton类,用于自定义进度对话框,用于show对话框,我们有show方法,用于Disclose,我们有Disclose方法,我调用这个类

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()
    }
}

使用show我可以显示进度对话框,但使用dimiss我无法关闭任何人是否可以告诉我我做错了什么,我使用的是kotlin语言。

当您调用“关闭”功能时,您会创建一个新的取消关闭对话框并尝试关闭它

这里我修改了你的解雇函数。我想这对你有帮助

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

    CShowProgress(this).getInstance().dismiss(this)
编辑:

哦,对不起,我没有检查你的单身模式。当您调用
CShowProgress(this)
时,您将创建一个类的新实例,这样您就不能关闭以前的对话框

您可以创建一个
Singleton
,如下所示:

fun dismiss() {
    if(m_Dialog.isShowing){
        m_Dialog.dismiss()
    }
}
它是这样的:

companion object {
    lateinit var instance: CShowProgress
        private set
}
instance = CShowProgress(context)
CShowProgress.instance.show(context,message)
并按如下方式使用“显示”对话框:

companion object {
    lateinit var instance: CShowProgress
        private set
}
instance = CShowProgress(context)
CShowProgress.instance.show(context,message)
然后像这样把它变小:

companion object {
    lateinit var instance: CShowProgress
        private set
}
instance = CShowProgress(context)
CShowProgress.instance.show(context,message)
但我认为如果你像这样重构代码,你仍然会面临我在下面解释的另一个问题

此外,当您显示一个新对话框时,您会失去对旧对话框的引用,因此无法取消它。基本上,您正在创建n个对话框,但只保留对上次创建的对话框的引用。所以你不能忽略以前的。因此,如果您继续这样做,您可以在显示新对话框之前关闭以前的对话框(如果存在)。但是这种模式很难管理多个警报对话框,所以我建议您更改它

CShowProgress.instance.dismiss()
最后将
Activity
上下文
传递给singleton对象,并且不清除活动
onDestroy
何时会导致内存泄漏。

请尝试此操作

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()
    }
在活动中,为类创建一个对象,并像下面这样使用show和Disclose方法

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()
    }
}
}

好的,等等,让我试试这个不起作用,你能告诉我如何在Activity@savepopulation中调用show和Disclose方法吗?你能给我@savepopulation中的Singlton的完整类吗?我不能更改它,因为我是kotlinNo的新手,不需要空检查。顺便说一句,m_对话框已经定义为非空reference@DevenDcostra我认为显示/取消不应使用单例模式。你可以检查kotlin extensions的这类任务。等等,让我试试这个,然后我会告诉它是否工作,你能告诉我如何调用Activity@Nikhil Jadhav中的show and Disclose方法吗