简体   繁体   English

使用 Kotlin 进行 FirebaseAuthentication 过程中的对话框进度条

[英]Dialog Progress Bar during the process FirebaseAuthentication with Kotlin

I create an android app with Kotlin.I use FireBase to authenticate.我使用 Kotlin 创建了一个 android 应用程序。我使用 FireBase 进行身份验证。 In the authentication UI,I woukd like to add a ProgressBar during the process FirebaseAuthentication ie when I click on SignIn Button the progressBar appear until the authentication success.在身份验证 UI 中,我想在 FirebaseAuthentication 过程中添加一个 ProgressBar,即当我点击登录按钮时,progressBar 会出现,直到身份验证成功。 I create a constraint Layout that contains a Progress Bar as the following code :我创建了一个包含进度条的约束布局,如下代码:

<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>

After click on button SignIn, in my authentication activity I put the code to inflate the layout with ProgressBar and then the FirebaseAuthentication with Email and Password :单击“登录”按钮后,在我的身份验证活动中,我将代码放入 ProgressBar 和 FirebaseAuthentication with Email 和 Password 来膨胀布局:

     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))
  fireBaseAuthentication = FirebaseAuth.getInstance()
      fireBaseAuthentication.signInWithEmailAndPassword(email, password).addOnCompleteListener { task ->
                dialog.show()
                if (task.isSuccessful) {
                    fireBaseId = fireBaseAuthentication.currentUser!!.uid
                    .......
                } else {
                    Toast.makeText(this, "${task.exception?.message}", Toast.LENGTH_LONG).show()
                }
                Handler().postDelayed({dialog.dismiss()},3000)

And I get the following error :我收到以下错误:

E/WindowManager: android.view.WindowLeaked: Activity com.app.honey.activity.user.authentication.Authentication has leaked window DecorView@5287511[Authentication] that was originally added here at android.view.ViewRootImpl.(ViewRootImpl.java:511) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) at android.app.Dialog.show(Dialog.java:329) at com.app.honey.activity.user.authentication.Authentication$signIn$1.onComplete(Authentication.kt:96) at com.google.android.gms.tasks.zzj.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.ja E/WindowManager: android.view.WindowLeaked: Activity com.app.honey.activity.user.authentication.Authentication 已经泄露了最初在 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) at com.google.android.gms.tasks.zzj.run(Unknown Source:4) at android.os.Handler。 handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java) :6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.ja va:858) D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.app.honey, PID: 2507 java.lang.IllegalArgumentException: View=DecorView@5287511[Authentication] not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:485) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:394) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:124) at android.app.Dialog.dismissDialog(Dialog.java:375) at android.app.Dialog.dismiss(Dialog.java:358) at com.app.honey.activity.user.authentication.Authentication$signIn$1$1.run(Authentication.kt:103) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit va:858) D/AndroidRuntime:关闭 VM E/AndroidRuntime:致命异常:主进程:com.app.honey,PID:2507 java.lang.IllegalArgumentException:View=DecorView@5287511[Authentication] 未附加到窗口管理器android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:485) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:394) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:124) at android.app.Dialog .dismissDialog(Dialog.java:375) at android.app.Dialog.dismiss(Dialog.java:358) at 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(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit .java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) I want to know what is the problem in my code and How can I correct it. .java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 我想知道我的代码有什么问题,我该如何纠正它。

Try the following code:试试下面的代码:

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()
    }
}

You must show the dialog before authenticating and dismiss it afterwards.您必须在验证之前显示对话框并在之后关闭它。 Also, you can't dismiss the dialog after transition between activities.此外,您不能在活动之间转换后关闭对话框。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM