1

我一直在网上搜索这个问题的解决方案,但不幸的是,我似乎找不到答案。我为其中带有 Spinner 的 PopupWindow 创建了一个 XML 文件。在按钮事件侦听器中,我调用以下代码来膨胀 PopupWindow 并将其显示在屏幕上。

LayoutInflater inflater = getLayoutInflater();
settings_layout = inflater.inflate(R.layout.setting_popout, (ViewGroup) findViewById(R.id.setting_popout));

// Creates a popup window of required width and height, and displays
// the popup in the center of the screen.
pw_settings = new PopupWindow(settings_layout, 400, 470, true); 
pw_settings.showAtLocation(settings_layout, Gravity.CENTER, 0, 0);

spColors = (Spinner) settings_layout.findViewById(R.id.linecolor);

// Sets the initial values of the color spinner and the listener
ArrayAdapter<CharSequence> adapter_color = 
    ArrayAdapter.createFromResource(this, R.array.colors_array, android.R.layout.simple_spinner_item);
adapter_color.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spColors.setAdapter(adapter_color);
spColors.setSelection(adapter_color.getPosition(over.color));

单击按钮时,弹出窗口显示正常。但是,当我单击 Spinner 时,我在 LogCat 中收到以下错误。

android.view.WindowManager$BadTokenException: 无法添加窗口——令牌 android.view.ViewRootImpl$W@41402a90 无效;您的活动正在运行吗?...

我不确定我做错了什么。任何帮助将不胜感激!谢谢!

4

3 回答 3

11

可能有点晚了,并且不完全是原始问题的答案,但我从另一个问题here中发现,将以下行插入到我的微调器的 xml 中可以防止发生该错误。

android:spinnerMode="dialog"

于 2014-01-14T15:06:29.570 回答
1

我现在已经遇到过几次这个问题,我发现的唯一不耗时的方法是上面 Mike Fosker 提出的方法。

android:spinnerMode="dialog"

使微调器的选项列表显示在单独的弹出窗口中,这不会触发您在代码中打开的初始弹出窗口。例如 :

<Spinner
android:id="@+id/myspinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:spinnerMode="dialog" />
于 2014-09-17T13:09:57.827 回答
0

尝试:

settings_layout = inflater.inflate(R.layout.setting_popout, null);
((ViewGroup) findViewById(R.id.setting_popout)).addView(settings_layout);

另外,为什么要将弹出窗口中的布局附加到ViewGroup您的活动中?您可能会逃脱:

settings_layout = inflater.inflate(R.layout.setting_popout, null);
于 2012-07-10T19:44:35.333 回答