2

我的 android 应用程序中有一个微调器,我可以让它显示但秒。我点击它,应用程序崩溃并抛出:

无法添加窗口——令牌 android.view.ViewRootImpl$Wfb@ 无效:您的活动是否正在运行?

布局很简单。我有一个活动,它有一个列表和一个用于向列表添加内容的按钮。单击时,添加按钮会打开一个弹出窗口,其中显示微调器、一个文本框和一个按钮。一切正常,直到我单击微调器。

现在我在谷歌搜索了一个小时,发现了这些:

Android - 向 Spinners 动态添加值

BadTokenException 无法在 PopUpWindow 中添加 Window Spinner

Android Spinner 错误:android.view.WindowManager$BadTokenException:无法添加窗口

和更多。它们似乎都指向上下文,但是我已经尝试了从使用“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)
4

3 回答 3

3
  1. 我认为您不应该使用应用程序上下文,而是使用活动上下文。
  2. 使用对话框而不是弹出窗口。它更容易,维护的代码更少,并且是 Google 的标准。
  3. 我认为微调器上需要有某种点击监听器。
于 2013-07-19T00:23:48.977 回答
2

多亏了 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();
}
于 2013-07-19T00:54:09.070 回答
1

您可能会尝试的一件事是使用您的活动上下文,而不是您的应用程序/基础上下文。这可能有助于解决这种情况。

于 2013-07-19T00:14:18.863 回答