Создание PopupWindow из IME: BadTokenException

Я пытаюсь создать всплывающее окно из службы 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();
    }
}

Любая помощь будет оценена по достоинству. Спасибо


person Andrew S    schedule 23.12.2012    source источник


Ответы (1)


Я обнаружил проблему - я пытался нарисовать всплывающее окно с использованием макета и использовать тот же макет, что и родитель. Решение состоит в том, чтобы установить родителя в другое представление. Я обнаружил, что это также импорт, чтобы убедиться, что представление было создано перед созданием всплывающего окна (например, с помощью обработчика/выполняемого).

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();
    }
}
person Andrew S    schedule 23.12.2012