마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 커스텀 다이얼로그 외부터치시 [closed]

0 추천
private CustomDialog mCustomDialog;
======================================================================
custom_btn.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    mCustomDialog = new CustomDialog(getParent(), singleListener);
    //mCustomDialog.setCanceledOnTouchOutside(true); 
    mCustomDialog.show();
   }
  });
메인화면
==================================================================

public class CustomDialog extends Dialog {
  
 private Button mCheck;
 private View.OnClickListener msingleClickListener;
 private CustomDialog mCustomDialog;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  // 다이얼로그 외부 화면 흐리게 표현
  WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();
   
  
  lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
  lpWindow.dimAmount = 0.8f;
  getWindow().setAttributes(lpWindow);
  //this.setCanceledOnTouchOutside(true); 
  
  Window window = this.getWindow();
  window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

  setContentView(R.layout.custom_dialog); 
  mCheck = (Button) findViewById(R.id.btn_cancle);
  mCheck.setOnClickListener(msingleClickListener);  
 }
 /*public boolean onTouchEvent(MotionEvent event)  
 {  

        if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  
        Log.i("asdf","Asdf");
                this.dismiss();  
        }  
        return false;  
 }  */
 
 public CustomDialog(Context context,
   View.OnClickListener singleListener) {
  super(context, android.R.style.Theme_Translucent_NoTitleBar); 
  this.msingleClickListener = singleListener;

 }

}

외부터치하면 다이얼로그를 닫게하려고 여러시도를 해봣지만 소용이 없어서 한번 질문해봅니다..

당연히 setCanceledOnTouchOutside(true); 도 줘보고 false 도 줘보기도 했으며

mainfest 에 minSdkVersion 에 버전이 10이하면 오류가 있다해서 11로 바꿔보기도 했습니다만.. 그래도 그러네요 ㅠ

 

질문을 종료한 이유: 해결!
검정색고양이 (1,040 포인트) 님이 2015년 7월 22일 질문
검정색고양이님이 2015년 7월 22일 closed
저같은 경우에도 커스텀 다이얼로그 사용했을 때,
님과는 반대상황으로 외부터치간섭막기 위해 false로 설정했는데 잘되던데요..
customDialog.setContentView(레이아웃);
customDialog.setCanceledOnTouchOutside(false);
customDialog.show();
요로코롬..
저같은경우에는 외부터치간섭을 받아야해서 true 로 한건데..아닌가요?
네, 외부터치 막으려면 false로, 아니면 true입니다.
영역외의 터치를 허용하시는거 보니, 다이얼로그 크기가 전체 크기는 아니신거같은데 레이아웃쪽이나 소스에서 , 다이얼로그 크기도 확인해보시는게 좋을 것 같습니다
다이얼로그는 전체크기가 아닙니다 그래서 외부터치하면 다이얼로그를 닫게하려하는것이고요

1개의 답변

0 추천
 
채택된 답변
다이얼로그 부분에

 WindowManager.LayoutParams wlp = new WindowManager.LayoutParams();
   wlp.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
      wlp.dimAmount = 0.8f;

  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
            wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
            wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        } else {
            wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
            wlp.height = WindowManager.LayoutParams.MATCH_PARENT;
        }
        wlp.gravity = Gravity.CENTER;
        getWindow().setAttributes(wlp);


  setContentView(R.layout.point_custom_dialog); 



 @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         Rect dialogBounds = new Rect();
         getWindow().getDecorView().getHitRect(dialogBounds);
  
         if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
             this.dismiss();
         }
         return super.dispatchTouchEvent(ev);
     }


이렇게 해결햇습니다.

 

검정색고양이 (1,040 포인트) 님이 2015년 7월 22일 답변
...