Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android.view.WindowLeaked:使用时显示警报对话框时出错_Android - Fatal编程技术网

android.view.WindowLeaked:使用时显示警报对话框时出错

android.view.WindowLeaked:使用时显示警报对话框时出错,android,Android,我已尝试在活动被销毁时关闭警报对话框 @Override public void onDestroy(){ super.onDestroy(); if (alertDialog != null && alertDialog.isShowing()) { alertDialog.dismiss(); } } 但我还是犯了一个错误: android.view.WindowLeaked: Act

我已尝试在活动被销毁时关闭警报对话框

 @Override
    public void onDestroy(){
        super.onDestroy();
        if (alertDialog != null && alertDialog.isShowing()) {
            alertDialog.dismiss();
        }
    }
但我还是犯了一个错误:

android.view.WindowLeaked: Activity com.Forewarn.ForewarnApp.activities.SignInActivity has leaked window DecorView@60f300f[] that was originally added here
     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:424)
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
     at android.app.Dialog.show(Dialog.java:316)
     at com.Forewarn.ForewarnApp.activities.SignInActivity.getFingerPrint(SignInActivity.java:713)
     at com.Forewarn.ForewarnApp.activities.SignInActivity$8.onClick(SignInActivity.java:428)
     at android.view.View.performClick(View.java:5612)
     at android.view.View$PerformClick.run(View.java:22285)
     at android.os.Handler.handleCallback(Handler.java:751)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:154)
     at android.app.ActivityThread.main(ActivityThread.java:6123)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
我在下面的方法中遇到了错误:在这个方法中,我使用了两个警报对话框

 public void getFingerPrint(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(!fingerprintManager.isHardwareDetected()){
            /**
             * An error message will be displayed if the device does not contain the fingerprint hardware.
             * However if you plan to implement a default authentication method,
             * you can redirect the user to a default authentication activity from here.
             * Example:
             * Intent intent = new Intent(this, DefaultAuthenticationActivity.class);
             * startActivity(intent);
             */
            Toast.makeText(getApplicationContext(),"Your Device does not have a Fingerprint Sensor",Toast.LENGTH_SHORT).show();

            //textView.setText("Your Device does not have a Fingerprint Sensor");
        } else {
            // Checks whether fingerprint permission is set on manifest
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                //textView.setText("Fingerprint authentication permission not enabled");
                Toast.makeText(getApplicationContext(),"Fingerprint authentication permission not enabled",Toast.LENGTH_SHORT).show();

            } else{
                // Check whether at least one fingerprint is registered
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!fingerprintManager.hasEnrolledFingerprints()) {

                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle);
                        alertDialogBuilder.setTitle("Touch ID isn't Set Up on This Device");
                        TextView myMsg = new TextView(this);
                        myMsg.setText("To set up Touch ID on this decice, go to Settings > Touch id & Passcode and add a valid fingerprint");
                        myMsg.setGravity(Gravity.CENTER_HORIZONTAL);
                        myMsg.setPadding(20,50,20,0);
                        myMsg.setTextColor(getResources().getColor(R.color.colorPrimary));
                        myMsg.setTextSize(15);
                        alertDialogBuilder.setView(myMsg);
                        //alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login");
                        alertDialogBuilder.setPositiveButton("Ok",new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //finish();
                                //Toast.makeText(getApplicationContext(),"Hai",Toast.LENGTH_SHORT).show();
                                startActivityForResult(new Intent(Settings.ACTION_SETTINGS), 0);
                            }
                        });

                        alertDialog = alertDialogBuilder.create();
                        alertDialog.show();

                        //textView.setText("Register at least one fingerprint in Settings");
                        //Toast.makeText(getApplicationContext(),"Register at least one fingerprint in Settings",Toast.LENGTH_SHORT).show();

                    }else{
                        // Checks whether lock screen security is enabled or not
                        if (!keyguardManager.isKeyguardSecure()) {
                            //textView.setText("Lock screen security not enabled in Settings");
                            Toast.makeText(getApplicationContext(),"Lock screen security not enabled in Settings",Toast.LENGTH_SHORT).show();

                        }else{
                            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle);
                            alertDialogBuilder.setIcon(R.drawable.fingerprint);
                            alertDialogBuilder.setTitle("Touch Id for FOREWARN");
                            TextView myMsg = new TextView(this);
                            if(hiddenEmail == null){
                                myMsg.setText("Sign In with User Id "+userName);
                            }else {
                                myMsg.setText("Sign In with User Id "+hiddenEmail);
                            }

                            myMsg.setGravity(Gravity.CENTER_HORIZONTAL);
                            myMsg.setPadding(10,50,10,0);
                            myMsg.setTextColor(getResources().getColor(R.color.colorPrimary));
                            myMsg.setTextSize(16);
                            alertDialogBuilder.setView(myMsg);
                            //alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login");
                            alertDialogBuilder.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //finish();
                                    Constant.isCanceled = "true";
                                }
                            });

                            alertDialog = alertDialogBuilder.create();
                            alertDialog.show();

                            generateKey();

                            if (cipherInit()) {
                                FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                                FingerprintHandler helper = new FingerprintHandler(this);
                                helper.startAuth(fingerprintManager, cryptoObject);
                            }
                        }
                    }
                }
            }
        }
    }
}
我已经添加了调用
dailog.disease()的
ondestory
方法。 我搞不清楚我哪里做错了。请帮帮我

漏窗DecorView@60f300f[]这是最初添加的

  • 如果对话框不是以前的
    disclose()
    ,则会出现上述异常
    活动
    结束
添加此部分

纠正

 if (cipherInit()) {
                            FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                            FingerprintHandler helper = new FingerprintHandler(this);
                            helper.startAuth(fingerprintManager, cryptoObject);
                        }
                            generateKey();
                            alertDialog = alertDialogBuilder.create();
                            alertDialog.show();
漏窗DecorView@60f300f[]这是最初添加的

  • 如果对话框不是以前的
    disclose()
    ,则会出现上述异常
    活动
    结束
添加此部分

纠正

 if (cipherInit()) {
                            FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                            FingerprintHandler helper = new FingerprintHandler(this);
                            helper.startAuth(fingerprintManager, cryptoObject);
                        }
                            generateKey();
                            alertDialog = alertDialogBuilder.create();
                            alertDialog.show();

通常,当您的活动被销毁、完成、暂停等后试图显示对话框时,会发生此问题

一些解决方案:

  • 检查您是否没有调用
    alertDialog.show()
    在完成、暂停或销毁活动并尝试控制它的同一父作用域中

    例如,您启动了另一个活动或流程,然后尝试显示有关当前活动的对话框

  • 如果(!this.isFinishing()){//show your dialog}
对于
您的活动

  • 在启动对话框之前,您还可以使用小技巧检查活动的状态:

    @重写受保护的void onPause(){isRunning=false;}

    @重写受保护的void onResume(){isRunning=true;}


  • 通常,当您的活动被销毁、完成、暂停等后试图显示对话框时,会出现此问题

    一些解决方案:

    • 检查您是否没有调用
      alertDialog.show()
      在完成、暂停或销毁活动并尝试控制它的同一父作用域中

      例如,您启动了另一个活动或流程,然后尝试显示有关当前活动的对话框

    • 如果(!this.isFinishing()){//show your dialog}
    对于
    您的活动

  • 在启动对话框之前,您还可以使用小技巧检查活动的状态:

    @重写受保护的void onPause(){isRunning=false;}

    @重写受保护的void onResume(){isRunning=true;}


  • 显示您的完整代码。您能看看我更新的代码吗?您能告诉我SignenActivity.java上有什么代码吗;电话号码:713?是的。在我的getFingerPrint()方法-->中,它是第二个alertdialog.show()-713行显示您的完整代码。您能看看我更新的代码吗?您能告诉我SignenActivity.java上有什么代码吗;电话号码:713?是的。在我的getFingerPrint()方法-->中,它是第二个alertdialog.show()-713 Linear。实际上,我的目的是在登录页面-->时,如果用户已使用指纹签名,它会显示触摸id的弹出窗口。因此,每次登录活动时,我都需要显示弹出窗口,如果用户已经设置了触摸id。实际上,我的目的是在登录页面-->时,如果用户已经使用指纹签名,则会显示触摸id的弹出窗口。因此,如果用户已经设置了触摸id,则每次登录活动时,我都需要显示弹出窗口。
     if (cipherInit()) {
                                FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                                FingerprintHandler helper = new FingerprintHandler(this);
                                helper.startAuth(fingerprintManager, cryptoObject);
                            }
                                generateKey();
                                alertDialog = alertDialogBuilder.create();
                                alertDialog.show();