从IME创建PopupWindow:BadTokenException

时间:2012-12-23 17:46:00

标签: keyboard popupwindow ime

我正在尝试从没有活动的IME服务(屏幕键盘)中显示一个弹出窗口。当我调用popUp.showAtLocation(layout,Gravity.CENTER,0,-100)时,我得到一个“Windowmanager $ BadTokenException:无法添加窗口 - 令牌null无效。”我知道从没有相关活动的服务打开弹出窗口有点不寻常 - 是否可能?

这是我的代码:

public void initiatePopupWindow()
{
    try {

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.popup_layout,null);

        // create a 300px width and 470px height PopupWindow
        popUp = new PopupWindow(layout, 300, 470, true);
        popUp.showAtLocation(layout, Gravity.CENTER, 0, -100);


        Button cancelButton = (Button) layout.findViewById(R.id.popup_cancel_button);
        cancelButton.setOnClickListener(inputView.cancel_button_click_listener);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

我发现了问题 - 我试图使用布局绘制弹出窗口并使用与父窗口相同的布局。解决方案是将父级设置为另一个视图。我发现在创建弹出窗口之前确保已创建视图也是重要的(例如,通过使用处理程序/ runnable)。

public void initiatePopupWindow()
{
    try {
        Log.i("dotdashkeyboard","initiatePopupWindow (from IME service)");
        LayoutInflater inflater = (LayoutInflater) this.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.popup_layout,null);

        // create a 300px width and 470px height PopupWindow
        popUp = new PopupWindow(layout, 300, 470, false);
        popUp.showAtLocation(inputView, Gravity.CENTER, 0, -100);

        Button cancelButton = (Button) layout.findViewById(R.id.popup_cancel_button);
        cancelButton.setOnClickListener(inputView.cancel_button_click_listener);

    } catch (Exception e) {
        e.printStackTrace();
    }
}