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