2013-03-22 3 views
4

PopupWindow 클래스를 테스트하려고합니다. 나는 팝업을 표시하려면이 방법을 만들었습니다 : 나는과의 모든 로그 정보를 얻을하지 않습니다 팝업이 제대로 표시되어PopupWindow TouchInterceptor가 작동하지 않습니다.

public void showPopup(){ 
      LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE); 
      View popupView = layoutInflater.inflate(R.layout.popup, null); 
      final PopupWindow popup = new PopupWindow(popupView, 
         LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT); 
      popup.setOutsideTouchable(true); 
      popup.setTouchable(true); 
      popup.setTouchInterceptor(new OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        Log.d("POPUP", event.toString()); 
        if(event.getAction() == MotionEvent.ACTION_OUTSIDE){ 
         popup.dismiss(); 
         return true; 
        } 
        return true; 
       } 
      }); 
      popup.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 200); 
} 

, 그런데 터치 인터셉터가 전혀 작동하지 않는 것 같다 물론 팝업 밖에서 누르는 경우 팝업이 해제되지 않습니다.

팝업이나 호스트 활동에 추가로 설정할 속성이 있습니까? 이 창 밖으로 클릭 그리고 당신이 진정한 필요를 모두 setFocusable() + setOutsideTouchable(), 당신은 setOnDismissListener를 사용하는 것이 좋습니다 때

+0

이 문제가 있었는데, 어떻게 수정했는지 기억합니다. – a54studio

답변

5
pw.setBackgroundDrawable (new BitmapDrawable()); 
pw.setFocusable(false); 
pw.setOutsideTouchable(true); 

사용이 코드는, 당신이 어떤 행동을 할 경우이

+0

안녕하세요, 저는 팝업 창 안에 목록이있는 코드 조각에 대해 작업 해 왔습니다. 그래서 나는 그것이 집중 될 수 있기를 바란다. 이 팝업 창을 닫으려면 외부 터치 이벤트를 어떻게 처리해야합니까? 내 옆에 코멘트에서 나는 내 방식 (새 OnTouchListener() { \t \t \t \t @Override \t \t \t \t 공공 부울 onTouch (보기 V, MotionEvent 이벤트) { \t \t \t \t \t popupWindow –

+0

popupWindow.setTouchInterceptor를 붙여 넣습니다 .dismiss(); \t \t \t \t \t 경우 (event.getAction() == MotionEvent.ACTION_OUTSIDE) { \t \t \t \t \t \t Log.e (TAG, "일부 이벤트는 창 외부에서 발생했습니다 : 외부 조치"); \t \t \t \t \t \t \t \t \t \t \t \t 반환 사실; \t \t \t \t \t} \t \t \t \t \t Log.e (TAG는 "일부 이벤트는 창 밖에 무슨 일이 있었"); \t \t \t \t \t \t \t \t \t \t 반환 거짓; \t \t \t \t} \t \t \t}); –

+0

코드 조각을 제거하고 위 코드를 추가하면 작동합니다. – Karthi

2

도움이되기를 바랍니다. 다이얼로그 대화 상자가 닫힐 때 예상대로 다이얼 onDismiss 메서드가 호출됩니다.

PopupWindow mPopupWindow = new PopupWindow(mRootView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); 
    mPopupWindow.setBackgroundDrawable(new ColorDrawable(android.R.color.transparent)); 
    mPopupWindow.setFocusable(true); 
    mPopupWindow.setOutsideTouchable(true); 
    mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { 
     @Override 
     public void onDismiss() { 
     // some action .... 
     } 
    }); 
+0

나는 당신의 솔루션으로 잘 작동했다. 그러나 일단이 함수가 실행되고 어떤 버튼을 클릭하면 앱은 java.lang.IllegalStateException 오류를 나타내는 크래시를 얻습니다 : 지정된 자식은 이미 부모를가집니다. 먼저 부모의 부모에 대해 removeView()를 호출해야합니다. '해결하려고했지만 알아 내지 못했지만 달성되지 못했습니다. 그것에 대한 제안? – Sabarish

+0

뷰 계층 구조에 여러 번 뷰를 추가하려고하면 이런 일이 발생합니다. 'addView()'또는'getLayoutInflater(). inflate (R.layout.xyz, parentView, true)'를 찾아야한다. – skywall