Android'无法添加窗口 - 令牌null不适用于应用程序'异常

时间:2011-10-28 18:18:00

标签: android android-dialog runtimeexception android-windowmanager

当我尝试打开对话框时,我收到以下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)

12 个答案:

答案 0 :(得分:418)

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

new Dialog(getApplicationContext());

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

您必须尝试:

new Dialog(YourActivity.this);

答案 1 :(得分:34)

您可以继续使用getApplicationContext(),但在使用之前,您应该添加此标记:dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),并且不会显示错误。

不要忘记添加权限:

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

答案 2 :(得分:12)

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

答案 3 :(得分:11)

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

new Dialog(getApplicationContext());

所以我不得不改变:

new Dialog(this);

它适用于我;)

答案 4 :(得分:3)

我猜 - 您是否正在尝试使用。

创建Dialog
 getApplicationContext()
 mContext which is passed by activity.

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

Activity activity=YourActivity.this;

现在它会很棒。

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

答案 5 :(得分:2)

我在上下文字段中尝试了这个:

this.getActivity().getParent()

它对我来说很好。这是一个从“片段”延伸出来的类:

public class filtro extends Fragment{...

答案 6 :(得分:1)

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

答案 7 :(得分:1)

您好,如果您正在使用适配器,可能会有机会。
在适配器中使用任何对话框时,您需要知道的所有信息,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

答案 8 :(得分:0)

当我尝试使用以下两种情况在Cordova插件下打开Progress Dialog时,我遇到了这个例外,

  1. new ProgressDialog(this.cordova.getActivity()。getParent());

  2. new ProgressDialog(this.cordova.getActivity()。getApplicationContext());

  3. 后来改变了这样,

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

    它对我来说很好。

答案 9 :(得分:0)

使用此和上下文不适用于我..但MyActivityName.this工作。希望这可以帮助任何需要它的人。

答案 10 :(得分:0)

我通过在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

答案 11 :(得分:0)

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

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