来自扩展 class 的对话框打开,但不使用 dialog.dismiss() Kotlin 关闭?

Dialog from extended class opens, but does not close using dialog.dismiss() Kotlin?

我看到过类似的其他问题,但它们不适用于这种特定情况。

我从 BaseFunctions 扩展了 RegisterActivity,对话框在其中创建、显示和关闭。

我可以使用函数controlProgressDialog(true)显示对话框,但我无法使用controlProgressDialog(false)关闭它。

代码如下:

RegisterActivity.kt:

package com.toxicflame427.flowr.activities

import android.app.Dialog
import android.os.Bundle
import android.text.TextUtils
import com.google.firebase.auth.FirebaseAuth
import com.toxicflame427.flowr.R
import com.toxicflame427.flowr.databinding.ActivityRegisterBinding

class RegisterActivity : BaseFunctions(){
private lateinit var binding : ActivityRegisterBinding

override fun onCreate(savedInstanceState: Bundle?) {
    binding = ActivityRegisterBinding.inflate(layoutInflater)

    super.onCreate(savedInstanceState)
    setContentView(binding.root)

    removeToolStatusBar()
    applyEvents()
}

private fun applyEvents(){
    binding.registerButton.setOnClickListener{
        registerUser()
    }
}

private fun validateRegisterCredentials() : Boolean{
    return when{
        TextUtils.isEmpty(binding.emailRegisterInput.text.toString().trim{it <= ' '}) -> {
            controlSnackBar("Please enter your email address", true)
            false
        }
        TextUtils.isEmpty(binding.passwordRegisterInput.text.toString().trim{it <= ' '}) -> {
            controlSnackBar("Please enter your password", true)
            false
        }
        TextUtils.isEmpty(binding.passwordConfirmRegisterInput.text.toString().trim{it <= ' '}) -> {
            controlSnackBar("Please confirm your password", true)
            false
        }
        binding.passwordRegisterInput.text.toString().trim{it <= ' '} != binding.passwordConfirmRegisterInput.text.toString().trim{it <= ' '} -> {
            controlSnackBar("Password and confirmation password do not match", true)
            false
        }
        else -> {
            true
        }
    }
}

private fun registerUser(){
    if(validateRegisterCredentials()){
        //Trying to display the dialog, it works
        controlProgressDialog(true)

        val email = binding.emailRegisterInput.text.toString().trim{ it <= ' ' }
        val password = binding.passwordRegisterInput.text.toString().trim { it <= ' ' }

        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener{ task ->
                //Trying to close the dialog, does not work
                controlProgressDialog(false)

                if (task.isSuccessful) {
                    //Just in case, in case i forget how to get the user
                    //val firebaseUser = task.result!!.user!!

                    finish()
                } else {
                    controlSnackBar(task.exception!!.message.toString(), true)
                }
            }
    }
}

和BaseFunctions.kt:

 package com.toxicflame427.flowr.activities

import android.app.Dialog
import android.content.Context
import android.os.Build
import android.view.WindowInsets
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.google.android.material.snackbar.Snackbar
import com.toxicflame427.flowr.R

open class BaseFunctions : AppCompatActivity() {
fun removeToolStatusBar(){
    //Check the API level of the device, lower api levels require a different
    // method of hiding the status bar
    @Suppress("DEPRECATION")
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
        //New way of removing status bar
        window.insetsController?.hide(WindowInsets.Type.statusBars())
    } else {
        //Old way must still be used if targeting older devices
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )
     }
 }

fun controlSnackBar(message : String, isError : Boolean){
    val snackBar : Snackbar = Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG)
    val snackBarView = snackBar.view

    if(isError){
        snackBarView.setBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_red_light))
        snackBar.show()
    } else {
        snackBarView.setBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_green_dark))
        snackBar.show()
    }
}

//This is the function attempted to be used
fun controlProgressDialog(showDialog : Boolean){
    val progressDialog = Dialog(this)
    progressDialog.setCancelable(false)
    progressDialog.setCanceledOnTouchOutside(false)
    progressDialog.setContentView(R.layout.progress_dialog)

    if(showDialog){
        progressDialog.show()
    } else {
        progressDialog.dismiss()
    }
}

}

我在代码中注释了正在使用的功能以及我正在尝试的地方。

我尝试过使用不同的上下文。 applicationContext 导致整个应用程序崩溃,基本上下文做同样的事情,'this' 有效但不允许我关闭对话框,this@RegisterActivity 有效但也不会让我关闭对话框,我曾尝试更改条件controlProgressDialog() 并且它也不起作用。

用户可以通过输入要在 Firebase 身份验证中使用的凭据来注册应用程序。我希望在对用户数据进行身份验证时显示该对话框,并在对用户数据进行身份验证后将其关闭。到目前为止,打开对话框有效,但关闭它无效。该应用程序不会崩溃或发生任何事情,只是对话框不想关闭。

对话框唯一显示的是一个纺车和文本“请稍候...”

任何帮助将不胜感激!

问题是,当您调用 controlProgressDialog(false)
它创建了一个 Dialog 的新实例,这就是旧对话框未被关闭的原因。

有两种解决方法:

  1. 首先是在调用controlProgressDialog时return一个Dialog的实例。
    例如:
fun getProgressDialog(): Dialog {
    val progressDialog = Dialog(this)
    progressDialog.setCancelable(false)
    progressDialog.setCanceledOnTouchOutside(false)
    progressDialog.setContentView(R.layout.progress_dialog)
    return progressDialog
}


// Show the dialog.
val dialog = getProgressDialog()
dialog.show()

// dismiss the dialog.
if(dialog.isShowing) dialog.dismiss()

  1. 其次是在 Activity 中保存对 Dialog 变量的全局引用,然后处理显示/关闭。