当我尝试打开对话框时,我收到以下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)
答案 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时,我遇到了这个例外,
new ProgressDialog(this.cordova.getActivity()。getParent());
new ProgressDialog(this.cordova.getActivity()。getApplicationContext());
后来改变了这样,
新的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());