안드로이드 팝업창 닫기


리스트 액티비티에 있는 아이템을 선택하면 팝업창을 띄우는 코드를 작성했습니다. 문제는 뒤로가기 키를 눌러도 팝업창이 닫히지 않는다는 것 입니다. 액티비티에 뒤로가기 키를 캐치하도록 했지만 등록이 되지 않아서 팝업창으로 보내는 뷰의 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);

하지만 이 역시도 작동하지 않네요. 도와주세요.

  • 2016년 06월 13일에 작성됨

조회수 176


1 답변


좋아요
0
싫어요
채택취소하기

이 문제는 팝업창이 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이 질문 내용대로 작동하도록 확장하는 방법도 있습니다.

  • 2016년 06월 14일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close