BadTokenException:无法添加窗口-窗口android.view.ViewRootImpl$W@cb70704已在三星设备上添加

时间:2018-06-19 23:03:26

标签: android xamarin xamarin.android

我正在使用Xamarin for Android,并且在AlertDialog.Builder.Show()方法中遇到此错误,但是它仅在某些Samsung(使用Android 7.0)设备上发生,我们尝试了其他一些设备,并且问题不会发生。我只有在使用应用程序一段时间后才能得到它。 stacktrace是以下

  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <f32579baafc1404fa37ba3ec1abdc0bd>:0 
  at Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <7802aa64ad574c33adca332a3fa9706a>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <7802aa64ad574c33adca332a3fa9706a>:0 
  at Android.App.AlertDialog+Builder.Show () [0x0000a] in <dc51acef1f304f0dab449a7fc6039799>:0 
  at Prizma.Controls.Common.BindingComboBox.ShowDialog () [0x00062] in C:\TeamProjects\PrizmaProject\Main\MobileSales.iOS\Prizma.Controls.iOS\Common\BindingComboBox.cs:408 
  --- End of managed Android.Views.WindowManagerBadTokenException stack trace ---
android.view.WindowManager$BadTokenException: Unable to add window -- window android.view.ViewRootImpl$W@cb70704 has already been added
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:902)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)
    at android.app.Dialog.show(Dialog.java:404)
    at android.app.AlertDialog$Builder.show(AlertDialog.java:1136)
    at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
    at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)
    at android.view.View.performClick(View.java:6261)
    at android.widget.TextView.performClick(TextView.java:11185)
    at android.view.View$PerformClick.run(View.java:23752)
    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:6776)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

我的代码是这样的

            try
            {
                AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
                a.SetTitle("Select");
                a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
                a.Create();
                a.Show();
            }
            catch (Exception ex)
            {
                //Exception code
            }

我将AlertDialog.Builder Show()方法放入“尝试捕获”中,但是在第一次获得异常后,每次都会得到它。

一些评论

  • 即使应用程序从未进入后台,我仍然会遇到此错误。
  • 该应用是使用最新的Android SDK(8.1)编译的
  • 我没有最新版本的Xamarin Android,但是现在有了它,问题仍然存在。
  • 不仅警告对话框不会在错误发生后显示,而且弹出菜单也是如此。
  • 我安装了带有Android 6.0.1的Samsung Galaxy J7 Prime,并且没有发生此错误,但是将其升级到7.0后,问题开始了。在其他设备(如摩托罗拉,Hawuei,LG等)中,即使它们具有Android 7.0,也不会出现此问题。

请帮助我,我在这个问题上有几个星期了,而拥有三星设备的客户正在杀死我:)

谢谢。

致谢

艾伦

3 个答案:

答案 0 :(得分:0)

在一个片段中像这样显示对话框:use if (!IsFinishing) in an activity

if (!((Activity)Context).IsFinishing) 
                {
 try
            {
                AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
                a.SetTitle("Select");
                a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
                a.Create();
                a.Show();
            }
            catch (Exception ex)
            {
                //Exception code
            }
}

答案 1 :(得分:0)

您要将对话框添加到无效的活动中,因此在显示对话框之前,应检查活动是否已通过以下方式完成:


        AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
        builder.setTitle(R.string.app_name);
        builder.setMessage(msg);
        AlertDialog alert = builder.create();
        //To check if activity is finished
        if (!((Activity)ctx).isFinishing()) {
            alert.show();
        }

答案 2 :(得分:0)

try
{
    RunOnUiThread (() => {
          AlertDialog.Builder a = new AlertDialog.Builder(MainActivity);
            a.SetTitle("Select");
            a.SetAdapter(_Adapter, new EventHandler<DialogClickEventArgs>(ClosedDialog));
            a.Create();
            a.Show();
    });
}
catch (Exception ex)
{
    //Exception code
}

参考:https://forums.xamarin.com/discussion/128420/badtokenexception-unable-to-add-window-window-android-view-viewrootimpl-has-already-been-added