I have a popup window displaying when I click an item in my list activity. The problem is that the back key doesn’t close it. I tried catching the back key in my list activity but it doesn’t register it…then I tried registering a onkeylistener to the view I’m passing to my popup window. Like this:
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;
}
});
which is passed to a popup like this:
pw = new PopupWindow(
pop,
240,
70,
true);
But that listener doesn’t fire neither. Can you help me? I’m out of ideas 🙂
This is because the popup window does not respond to onTouch or onKey events unless it has a background that != null. Check out some code I wrote to help with this. In the basic case you can to call
PopupWindow#setBackgroundDrawable(new BitmapDrawable())to force it to act the way you expect. You won’t need your own onKey listener. You might also need to callPopupWindow#setOutsideTouchable(true)if you want it to go away when the user clicks outside of the window boundaries.Extended esoteric answer:
The reason the background cannot be null is because of what happens in
PopupWindow#preparePopup. If it detectsbackground != nullit creates an instance ofPopupViewContainerand callssetBackgroundDrawableon that and puts your content view in it.PopupViewContaineris basically aFrameLayoutthat listens for touch events and theKeyEvent.KEYCODE_BACKevent to dismiss the window. If background == null, it doesn’t do any of that and just uses your content view. You can, as an alternative to depending onPopupWindowto handle that, extend your rootViewGroupto behave the way you want.