Увольнение всплывающего окна Android

У меня есть отображение всплывающего окна, когда я нажимаю объект в своем действии списка. Проблема состоит в том, что задний ключ не закрывает его. Я пытался ловить спину, вводят мое действие списка, но это не регистрирует его... затем я пытался регистрировать onkeylistener к представлению, я являюсь передающим к своему всплывающему окну. Как это:

pop.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            boolean res=false;
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                // do something on back.
                Log.e("keydown","back");
                if (pw.isShowing()) {
                    Log.e("keydown","pw showing");
                    pw.dismiss();
                    res = true;
                }
            } else {
                res = false;
            }
            return res;
        }
    });

который передается всплывающему окну как это:

pw = new PopupWindow(
       pop, 
       240, 
       70, 
       true);

Но тот слушатель не увольняет ни одного. Можно ли помочь мне? Я вне идей :)

61
задан Rich Schuler 26 June 2010 в 12:55
поделиться

1 ответ

Это происходит потому, что всплывающее окно не реагирует на события onTouch или onKey, если у него нет фона, который != null. Посмотрите код, который я написал, чтобы помочь с этим. В базовом случае вы можете вызвать PopupWindow#setBackgroundDrawable(new BitmapDrawable()), чтобы заставить его действовать так, как вы ожидаете. Вам не понадобится собственный слушатель onKey. Вам также может понадобиться вызвать PopupWindow#setOutsideTouchable(true), если вы хотите, чтобы он исчезал, когда пользователь щелкает за пределами границ окна.

Расширенный эзотерический ответ:

Причина, по которой фон не может быть нулевым, заключается в том, что происходит в PopupWindow#preparePopup. Если он обнаруживает background != null, он создает экземпляр PopupViewContainer, вызывает setBackgroundDrawable и помещает в него ваше представление содержимого. PopupViewContainer - это по сути FrameLayout, который слушает события касания и KeyEvent.KEYCODE_BACK, чтобы закрыть окно. Если background == null, то ничего из этого не происходит и просто используется представление содержимого. Вы можете, в качестве альтернативы зависимости от PopupWindow для обработки этого, расширить вашу корневую ViewGroup, чтобы она вела себя так, как вы хотите.

148
ответ дан 24 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: