【问题标题】:BadTokenException Unable to add Window Spinner in PopUpWindowBadTokenException 无法在 PopUpWindow 中添加 Window Spinner
【发布时间】:2013-06-21 16:46:54
【问题描述】:

我知道这里有很多类似的问题,但我无法转移我的问题的答案(或者我没有找到我需要的答案...)

在我的 actionBar 菜单中(在 onOptionsItemSelected 中),我打开一个用于用户设置的弹出窗口。 Checkbox 和 RadioButtons 工作正常,但如果我在 Spinner 上按 Tab,将会出现 FATAL EXCEPTION:

FATAL EXCEPTION: main
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@42766f00 is not valid; is your activity running?

这是onOptionsItemSelected方法中的代码:

LayoutInflater inflaterSettings = LayoutInflater.from(context);
final LinearLayout llSettings = (LinearLayout) inflaterSettings.inflate(R.layout.actionbar_menu_settings_popup, null);
Spinner spinner = (Spinner) llSettings .findViewById(R.id.spinner_action_settings_intervall_values);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){ TODO}
    @Override
    public void onNothingSelected(AdapterView<?> parent) { // TODO }
});
PopupWindow popUp = new PopupWindow(context);
popUp.setContentView(llSettings);
llSettings.post(new Runnable()
{
    @Override
    public void run()
    {
        popUp.showAtLocation(llSettings, Gravity.CENTER, 0, 0);
        int width = getResources().getDisplayMetrics().widthPixels;
        int height = getResources().getDisplayMetrics().heightPixels;
        width = (int) (width * 0.9);
        height = (int) (height * 0.9);
        popUp.update(width, height);
    }
});

我的 actionbar_menu_settings_popup.xml:

<Spinner
    android:id="@+id/spinner_action_settings_intervall_values"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawSelectorOnTop="true"
    android:entries="@array/action_settings_intervall_values" />

在string.xml中:

<string-array name="action_settings_intervall_values">
    <item>5</item>
    <item>15</item>
    <item>30</item>
    <item>45</item>
    <item>60</item>
    <item>120</item>
    <item>180</item>
</string-array>

编辑

登录onOptionsItemSelected:

Log.i("MainActivity#onCreateOptionsItems", "context: " + context);
Log.i("MainActivity#onCreateOptionsItems", "getApplicationContext: " + getApplicationContext());
Log.i("MainActivity#onCreateOptionsItems", "this: " + this);

结果:

06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): context: de.xy.app.activities.MainActivity@42743818
06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): getApplicationContext: android.app.Application@42741d48
06-21 10:40:58.185: I/MainActivity#onCreateOptionsItems(14463): this: de.xy.app.activities.MainActivity@42743818

【问题讨论】:

  • 你在哪里分配上下文?
  • onCreate 我做了context = this;
  • 您的弹出窗口没有附加窗口管理器。
  • 以及如何做到这一点?弹出窗口显示正确....

标签: android popupwindow android-windowmanager


【解决方案1】:

换行

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.action_settings_intervall_values, android.R.layout.simple_spinner_item);

这主要是因为错误的上下文引用。

【讨论】:

  • 您需要传递适当的上下文。在哪里传递 Context (this/context) ..replace this->context 或反之亦然。我想问题会解决的。
  • 测试了所有版本。记录了不同的调试选项,查看编辑部分。不要误解我:我知道错误的上下文可能是个问题,但我不知道它是否在这里。不知道,我能做什么..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2017-07-15
  • 2013-09-10
相关资源
最近更新 更多