无法在Android应用中使用Spinner

时间:2013-07-18 21:39:34

标签: java android

我的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)

3 个答案:

答案 0 :(得分:2)

  1. 我认为您不应该使用应用程序上下文,而是使用活动上下文。
  2. 使用对话框而不是弹出窗口。它更容易,维护代码更少,而且根据谷歌的标准。
  3. 我认为在微调器上需要有某种点击监听器。

答案 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)

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