我的Android应用程序中有一个微调器,我可以让它显示但是秒。我点击它,应用程序崩溃并抛出:
无法添加窗口 - 令牌android.view.ViewRootImpl $ Wfb @无效:您的活动是否在运行?
布局简单。我有一个活动,其中包含一个列表和一个按钮,可以向列表中添加内容。单击时,添加按钮会打开一个弹出窗口,显示微调器,文本框和按钮。一切正常,直到我点击微调器。
现在我搜索了谷歌一个小时,发现了这些:
Android - Dynamically Adding values to Spinners
BadTokenException Unable to add Window Spinner in PopUpWindow
Android Spinner Error : android.view.WindowManager$BadTokenException: Unable to add window
等等。它们似乎都指向了上下文,但是我已经尝试了从使用“this”到getApplicationContext到我的activity.context名称的所有内容,但没有一个可行。我尝试使用两次提供的答案,而不是仅仅将contentView设置为页面,这使事情变得更糟(应用程序立即崩溃了一个空指针异常)。
这是弹出窗口的代码(单击“添加”按钮时执行):
public void add_itinerary_clicked(View view)
{
LayoutInflater i = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = i.inflate(R.layout.itinerary_add_item_page, null);
popup = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popup.showAtLocation(popupView , Gravity.CENTER, 0, 0);
Spinner airlineChoice = (Spinner) popupView.findViewById(R.id.airlineSpinner);
Button addBtn= (Button) popupView.findViewById(R.id.finish_addItinerary);
String[] list = new String[1];
list = airlineMap.keySet().toArray(list);
ArrayAdapter<CharSequence> spinnerAdapter = new ArrayAdapter<CharSequence>(getApplicationContext(), android.R.layout.simple_spinner_item, list );
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
airlineChoice.setAdapter(spinnerAdapter);
addBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish_addItinerary_clicked();
popup.dismiss();
}
});
}
我现在完全不知所措。如果不是上下文(我已经尝试过其他人所说的话)那么它是什么?
以下是完整的错误消息:
FATAL EXCEPTION: main
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@40de1700 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:993)
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:899)
at android.widget.ListPopupWindow.show(ListPopupWindow.java:603)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:981)
at android.widget.Spinner.performClick(Spinner.java:609)
at android.view.View$PerformClick.run(View.java:17355)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
答案 1 :(得分:1)
感谢Buggie,我找到了一个解决方法。我正在使用对话框。它工作,并没有抛出错误。我不确定为什么这会起作用,弹出窗口不会,但这是我的代码有效:
public void add_itinerary_clicked(View view)
{
dialog = new Dialog(this);
dialog.setContentView(R.layout.itinerary_add_item_page);
Spinner airlineChoice = (Spinner) dialog.findViewById(R.id.airlineSpinner);
Button addBtn= (Button) dialog.findViewById(R.id.finish_addItinerary);
String[] list = new String[1];
list = airlineMap.keySet().toArray(list);
ArrayAdapter<CharSequence> spinnerAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, list );
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
airlineChoice.setAdapter(spinnerAdapter);
airlineChoice.setOnItemSelectedListener(this);
addBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish_addItinerary_clicked();
dialog.dismiss();
}
});
dialog.show();
}
答案 2 :(得分:0)
您可能尝试的一件事是使用您的活动上下文,而不是您的应用程序/基本上下文。这可能有助于这种情况。