안드로이드 팝업창 닫기
조회수 2952회
리스트 액티비티에 있는 아이템을 선택하면 팝업창을 띄우는 코드를 작성했습니다. 문제는 뒤로가기 키를 눌러도 팝업창이 닫히지 않는다는 것 입니다. 액티비티에 뒤로가기 키를 캐치하도록 했지만 등록이 되지 않아서 팝업창으로 보내는 뷰의 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);
하지만 이 역시도 작동하지 않네요. 도와주세요.
1 답변
-
이 문제는 팝업창이 null이 아닌 배경을 갖고 있지 않은 이상, onTouch나 onKey에 반응하지 않기 때문에 발생하는 문제입니다. 이 문제에 대해 도움을 받으려면 여기 있는 코드를 참고하세요. 일반적인 경우에는
PopupWindow#setBackgroundDrawable(new BitmapDrawable())
을 호출하여 강제로 문제를 해결할 수 있습니다. 이 경우에는 onKeyListener를 따로 만드실 필요가 없습니다. 또한 사용자가 창 바깥 영역을 클릭했을 때 팝업창이 꺼지도록 하려면PopupWindow#setOutsideTouchable(true)
을 호출하면 됩니다.심화된 답변 :
배경이 null이면 안되는 이유는
PopupWindow#preparePopup
에서 발생하는 일 때문입니다. 만약background != null
라면 이는PopupViewContainer
의 인스턴스를 생성하고setBackgroundDrawable
을 호출하여 뷰를 그 안에 넣습니다.PopupViewContainer
는 기본적으로 터치 이벤트와KeyEvent.KEYCODE_BACK
이벤트에 반응하는FrameLayout
입니다. 그러나 만약 배경이 null이라면, 아무런 이벤트에도 반응하지 않고 개발자가 생성한 뷰를 사용합니다. 이 문제를 해결하기 위해PopupWindow
를 이용하는 대신에 최상위ViewGroup
이 질문 내용대로 작동하도록 확장하는 방법도 있습니다.
댓글 입력