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语言。
答案 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