Android 使用Kotlin进行FirebaseAuthentication过程中的对话框进度栏
我用Kotlin创建了一个android应用程序。我使用FireBase进行身份验证。在身份验证UI中,我想在FirebaseAuthentication过程中添加一个进度条,即当我单击SignIn按钮时,进度条将出现,直到身份验证成功。我创建了一个包含进度条的约束布局,如下代码所示:Android 使用Kotlin进行FirebaseAuthentication过程中的对话框进度栏,android,kotlin,dialog,android-progressbar,Android,Kotlin,Dialog,Android Progressbar,我用Kotlin创建了一个android应用程序。我使用FireBase进行身份验证。在身份验证UI中,我想在FirebaseAuthentication过程中添加一个进度条,即当我单击SignIn按钮时,进度条将出现,直到身份验证成功。我创建了一个包含进度条的约束布局,如下代码所示: <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/an
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cp_bg_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
.....>
<ProgressBar
android:id="@+id/cp_pbar"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_gravity="center"
android:indeterminateTint="@color/honey"
...... />
<TextView
android:id="@+id/cp_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
.... />
</androidx.constraintlayout.widget.ConstraintLayout>
我得到以下错误:
E/WindowManager:android.view.WindowManager:Activity
com.app.honey.activity.user.authentication.authentication已泄漏
窗口DecorView@5287511最初添加的[身份验证]
在这里
在android.view.ViewRootImpl。(ViewRootImpl.java:511)
在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
在android.app.Dialog.show上(Dialog.java:329)
在com.app.honey.activity.user.authentication.authentication$signIn$1.onComplete上(authentication.kt:96)
访问com.google.android.gms.tasks.zzj.run(未知来源:4)
位于android.os.Handler.handleCallback(Handler.java:873)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:193)
位于android.app.ActivityThread.main(ActivityThread.java:6669)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
D/AndroidRuntime:关闭VM E/AndroidRuntime:致命异常:
主要的
进程:com.app.honey,PID:2507
java.lang.IllegalArgumentException:视图=DecorView@5287511[身份验证]未连接到窗口管理器
在android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:485)中
在android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:394)
在android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:124)中
在android.app.Dialog.dismissDialog(Dialog.java:375)上
在android.app.Dialog.disclose(Dialog.java:358)中
在com.app.honey.activity.user.authentication.authentication$signIn$1$1.run(authentication.kt:103)
位于android.os.Handler.handleCallback(Handler.java:873)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:193)
位于android.app.ActivityThread.main(ActivityThread.java:6669)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我想知道我的代码中存在什么问题,以及如何纠正它
请尝试以下代码:
val dialog = Dialog(this)
val inflate = LayoutInflater.from(this).inflate(R.layout.layout_progress_bar, null)
dialog.setContentView(inflate)
dialog.setCancelable(false)
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.show()
fireBaseAuthentication = FirebaseAuth.getInstance()
fireBaseAuthentication.signInWithEmailAndPassword(email, password).addOnCompleteListener { task ->
if (task.isSuccessful) {
...
finish()
} else {
dialog.dismiss()
Toast.makeText(this, "${task.exception?.message}", Toast.LENGTH_LONG).show()
}
}
您必须在进行身份验证之前显示该对话框,然后将其关闭。此外,您不能在活动之间转换后关闭对话框。您的代码可以正常工作,但在对话框关闭后,身份验证活动仍将持续,并有时间转到mainactivity@Lina好啊如果结果成功,则不能关闭该对话框。在转换到主活动之后,在身份验证活动中调用finish()方法。当调用finish()方法时,活动完成并仍然等待一段时间打开主活动,这不是问题solution@Lina您是否已将dialog.dismise()调用移动到else语句?仍有问题,活动完成后,仍需等待一段时间才能打开主活动
val dialog = Dialog(this)
val inflate = LayoutInflater.from(this).inflate(R.layout.layout_progress_bar, null)
dialog.setContentView(inflate)
dialog.setCancelable(false)
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.show()
fireBaseAuthentication = FirebaseAuth.getInstance()
fireBaseAuthentication.signInWithEmailAndPassword(email, password).addOnCompleteListener { task ->
if (task.isSuccessful) {
...
finish()
} else {
dialog.dismiss()
Toast.makeText(this, "${task.exception?.message}", Toast.LENGTH_LONG).show()
}
}