我見過其他類似的問題,但它們不適用于這種特定情況。
我從 BaseFunctions 擴展了 RegisterActivity,在那里創建、顯示和關閉對話框。
我可以使用該函式顯示對話框controlProgressDialog(true),但無法使用controlProgressDialog(false).
這是代碼:
注冊活動.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 身份驗證中使用的憑據來注冊應用。我希望在對用戶資料進行身份驗證時顯示對話框,并在用戶資料完成身份驗證時關閉對話框。到目前為止,打開對話框有效,但關閉它不起作用。該應用程式不會崩潰或發生任何事情,只是對話框不想關閉。
對話框顯示的唯一內容是一個旋轉輪和文本“請稍候...”
任何幫助將不勝感激!
uj5u.com熱心網友回復:
問題是,當您呼叫 時controlProgressDialog(false),
它會創建一個新實體,Dialog這就是舊對話框不會被關閉的原因。
有2個解決方案:
- 首先是
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()
- 其次是
Dialog在 Activity 中保存對變數的全域參考,然后處理顯示/解除。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373189.html
