【问题标题】:Android 'Unable to add window -- token null is not for an application' exceptionAndroid '无法添加窗口 -- 令牌 null 不适用于应用程序' 异常
【发布时间】:2011-12-17 12:09:18
【问题描述】:

当我尝试打开对话框时出现以下 Android 异常。有人可以帮我了解发生了什么,我该如何解决这个问题?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

【问题讨论】:

标签: android android-dialog runtimeexception android-windowmanager


【解决方案1】:

以防万一您尝试从片段中显示对话框。 只需使用“getActivity()”方法即可。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

【讨论】:

    【解决方案2】:

    您好,如果您使用适配器,可能会有机会。
    当您在适配器中使用任何对话框时,您需要知道的所有内容、getContext()、上下文或活动有时都不起作用。

    这是我使用的技巧 v.getRootView().getContext() 其中 v 是您正在引用的视图对象。
    例如。

    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                            .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                            myCalendar.get(Calendar.DAY_OF_MONTH)).show();
                }
            });  
    If you are getting this problem because of alert dialog.
    Refer [here][1] But it is same concept.
    
    
      [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class
    

    【讨论】:

    • 谢谢!节省了我宝贵的时间! (^_^)
    【解决方案3】:

    我通过在 AndroidManifest.xml 中添加以下用户权限解决了这个错误

     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    

    另外,使用活动名称初始化警报对话框:

    AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
    

    欲了解更多详情,请访问==> How to create Alert Dialog in Android

    【讨论】:

      【解决方案4】:

      我遇到了同样的例外。我要解决这个问题是传递对话框的实例 作为函数的参数并使用它而不是仅传递上下文然后使用 getContext()。这个解决方案解决了我的问题,希望它可以帮助

      【讨论】:

        【解决方案5】:

        使用这个和上下文对我不起作用..但 MyActivityName.this 有效。希望对需要的人有所帮助。

        【讨论】:

          【解决方案6】:

          当我尝试使用以下两种情况在 Cordova 插件下打开进度对话框时遇到此异常,

          1. 新的 ProgressDialog(this.cordova.getActivity().getParent());

          2. 新 ProgressDialog(this.cordova.getActivity().getApplicationContext());

          后来改成这样了,

          new ProgressDialog(this.cordova.getActivity());

          它对我来说很好用。

          【讨论】:

            【解决方案7】:

            你可以继续使用getApplicationContext(),但是在使用之前,你应该加上这个标志:dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),这样就不会出现错误了。

            别忘了添加权限:

            <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
            

            【讨论】:

            • 是的,很简单。并且不要忘记添加权限,我刚刚编辑了。
            • 不能在 RecyclerAdapter 中使用 getActivity()
            • 太棒了:)
            • 如何添加标志?
            【解决方案8】:

            context 的参数位置尝试getParent(),例如new AlertDialog.Builder(getParent()); 希望它会起作用,它对我有用。

            【讨论】:

            • 为什么要使用 getParent()?,什么意思?
            • 当您在另一个未扩展 Activity 类的类中显示任何对话框时,您可能无法获得扩展 Activity 的该类的上下文。因此,要在您尝试显示对话框但不扩展 Activity 的类中获取上下文,您可以使用 getParent() 返回该高级活动的上下文。
            • 感谢@PriyankJoshi,你救了我的命,它还解决了“Android 无法添加窗口无效;您的活动正在运行吗?”的奇怪异常。
            • 我如何使用 getParent() ?
            • 谢谢!它在我的情况下有效。我打电话给this.parent.getActivity().getApplicationContext(),但this.parent.getActivity()成功了。
            【解决方案9】:

            我猜 - 您是否尝试使用应用程序上下文创建 Dialog?像这样的:

            new Dialog(getApplicationContext());
            

            这是错误的。您需要使用 Activity 上下文。

            你必须尝试:

            new Dialog(YourActivity.this);

            【讨论】:

            • 谢谢。但我没有使用 new Dialog(getApplicationContext());我只使用'new AlertDialog.Builder(mContext);'其中 mContext 是对活动的引用。
            • 那么mContext应该是MyActivity.this。
            • 用于创建自定义对话框的 android 文档 (developer.android.com/guide/topics/ui/dialogs.html#CustomDialog) 出现此错误。上下文 mContext = getApplicationContext();对话框对话框=新对话框(mContext);您的修复导致 Dialog dialog = new Dialog(this);哪个有效!谢谢
            • developer.android.com/guide/topics/ui/dialogs.html 已修复(不久之后)。只是指出这一点以供参考。图案也得到了改进。 :)
            • 使用getActivity()@SagarDevanga
            【解决方案10】:

            我猜 - 你是在尝试使用创建 Dialog。

             getApplicationContext()
             mContext which is passed by activity.
            

            如果您显示对话框非活动类,那么您必须将活动作为参数传递。

            Activity activity=YourActivity.this;
            

            现在它会很好用。

            如果您发现任何问题,请告诉我。

            【讨论】:

              【解决方案11】:

              我在上下文字段中尝试过:

              this.getActivity().getParent()
              

              它对我来说很好用。这是从“片段”扩展而来的一个类:

              public class filtro extends Fragment{...
              

              【讨论】:

                【解决方案12】:

                就我而言,我试图创建这样的对话框:

                new Dialog(getApplicationContext());
                

                所以我不得不改变:

                new Dialog(this);
                

                它对我来说很好;)

                【讨论】:

                • 您的答案是正确的,但是只有在您处于活动范围内时才有效。如果您在内部范围内,则必须使用MyActivity.class 而不是this,因为this 指的是不同的对象。
                • 另外,this 将确保您的 Dialog 继承您的主题。
                猜你喜欢
                • 1970-01-01
                • 2011-05-28
                • 2019-01-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-07
                • 2012-09-12
                • 1970-01-01
                相关资源
                最近更新 更多