来自扩展 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
的新实例,这就是旧对话框未被关闭的原因。
有两种解决方法:
- 首先是在调用
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()
- 其次是在 Activity 中保存对
Dialog
变量的全局引用,然后处理显示/关闭。
我看到过类似的其他问题,但它们不适用于这种特定情况。
我从 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
的新实例,这就是旧对话框未被关闭的原因。
有两种解决方法:
- 首先是在调用
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()
- 其次是在 Activity 中保存对
Dialog
变量的全局引用,然后处理显示/关闭。