У меня есть отображение всплывающего окна, когда я нажимаю объект в своем действии списка. Проблема состоит в том, что задний ключ не закрывает его. Я пытался ловить спину, вводят мое действие списка, но это не регистрирует его... затем я пытался регистрировать 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);
Но тот слушатель не увольняет ни одного. Можно ли помочь мне? Я вне идей :)
Это происходит потому, что всплывающее окно не реагирует на события 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
, чтобы она вела себя так, как вы хотите.