Диалоговое окно из расширенного класса открывается, но не закрывается с помощью dialog.dismiss() Котлин?

#android #kotlin #android-dialog

#Android #котлин #android-диалог

Вопрос:

Я видел и другие подобные вопросы, но они не применимы к данной конкретной ситуации.

У меня есть функция регистрации, которая распространяется на базовые функции, где создается, отображается и закрывается диалоговое окно.

Я могу отобразить диалоговое окно с помощью функции controlProgressDialog(true) , но я не могу закрыть его с помощью controlProgressDialog(false) .

Вот код:

Активность регистрации.тыс. т:

 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 lt;= ' '}) -gt; {  controlSnackBar("Please enter your email address", true)  false  }  TextUtils.isEmpty(binding.passwordRegisterInput.text.toString().trim{it lt;= ' '}) -gt; {  controlSnackBar("Please enter your password", true)  false  }  TextUtils.isEmpty(binding.passwordConfirmRegisterInput.text.toString().trim{it lt;= ' '}) -gt; {  controlSnackBar("Please confirm your password", true)  false  }  binding.passwordRegisterInput.text.toString().trim{it lt;= ' '} != binding.passwordConfirmRegisterInput.text.toString().trim{it lt;= ' '} -gt; {  controlSnackBar("Password and confirmation password do not match", true)  false  }  else -gt; {  true  }  } }  private fun registerUser(){  if(validateRegisterCredentials()){  //Trying to display the dialog, it works  controlProgressDialog(true)   val email = binding.emailRegisterInput.text.toString().trim{ it lt;= ' ' }  val password = binding.passwordRegisterInput.text.toString().trim { it lt;= ' ' }   FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)  .addOnCompleteListener{ task -gt;  //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)  }  }  } }  

И базовые функции.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 gt;= 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 вызывает сбой всего приложения, базовый контекст делает то же самое, «это» работает, но не позволяет мне закрыть диалоговое окно, это@RegisterActivity работает, но также не позволяет мне закрыть диалоговое окно, я попытался изменить условие в controlProgressDialog (), и это тоже не сработало.

Пользователи могут зарегистрироваться в приложении, введя свои учетные данные для использования при проверке подлинности Firebase. Я хочу, чтобы диалоговое окно отображалось во время аутентификации пользовательских данных и закрывалось, когда аутентификация пользовательских данных завершена. Пока что открытие диалогового окна работает, но его закрытие-нет. Приложение не аварийно завершает работу или что-то в этом роде, просто диалоговое окно не хочет закрываться.

Единственное, что отображается в диалоговом окне, — это вращающееся колесо и текст «Пожалуйста, подождите…»

Любая помощь будет очень признательна!

Ответ №1:

Проблема в том, что при вызове controlProgressDialog(false)
создается новый экземпляр Dialog , поэтому старое диалоговое окно не закрывается.

Для этого есть 2 решения:

  1. Во-первых, нужно вернуть экземпляр Dialog при вызове controlProgressDialog .
    Например:
 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. Во-вторых, необходимо сохранить глобальную ссылку на Dialog переменную в действии, а затем обработать показ / отклонение.