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

时间:2017-12-06 09:36:26

标签: android kotlin progressdialog

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

这是我的自定义进度对话框的showlton类,用于show对话框我们有show方法,对于dismiss我们有dismiss方法我叫这个类

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

    CShowProgress(this).getInstance().dismiss(this)

使用show我可以显示进度对话框但是使用dimiss我无法解雇任何人都可以告诉我我在做什么错误我使用kotlin语言。

2 个答案:

答案 0 :(得分:1)

当你打电话给你的解雇时,你会创建一个新的未示出的对话框并试图将其解雇。

这里我修改了你的dismiss func。我想这会帮助你。

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

修改

哦对不起,我没有检查你的单身人士模式。当您致电CShowProgress(this)时,您会创建一个新的班级实例,因此您无法忽略之前的对话框。

您可以创建如下所示的Singleton

companion object {
    lateinit var instance: CShowProgress
        private set
}

并像这样初始化:

instance = CShowProgress(context)

并使用如下显示对话框:

CShowProgress.instance.show(context,message)

并且像这样dimiss:

CShowProgress.instance.dismiss()

但我认为如果你重构这样的代码,你还会面临我在下面解释的另一个问题。

此外,当您显示一个新对话框时,您将松开对旧对话框的引用,因此您无法将其解除。基本上,您可以创建n对话框,但只保留对上次创建的对话框的引用。所以你不能忽视以前的那些。因此,如果您继续这样做,您可以在显示新对话框之前解除之前的对话框。但是这种模式很难管理多个警报对话框,所以我建议你改变它。

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何时会导致内存泄漏。

答案 1 :(得分:1)

请试试这个

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