답변:
dialog.setCanceledOnTouchOutside(true);
대화 상자 외부를 터치하면 대화 상자를 닫을 수 있습니다 .
같은 것
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true);
또는 모델이 아닌 대화가
1- FLAG_NOT_TOUCH_MODAL
대화 상자의 창 속성에 대한 플래그 설정
Window window = this.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
2-Windows 속성에 다른 플래그를 추가합니다 FLAG_WATCH_OUTSIDE_TOUCH
.-대화 상자가 표시되는 영역 외부에서 터치 이벤트를 수신하기위한 것입니다.
3- onTouchEvent()
대화 상자를 무시 하고 조치 유형을 확인하십시오. 조치 유형이 ' MotionEvent.ACTION_OUTSIDE
'인 경우 사용자는 대화 상자 영역 외부에서 상호 작용하고 있습니다. 따라서이 경우 대화 상자를 닫거나 수행하려는 작업을 결정할 수 있습니다. 지문을 보시겠습니까?
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
System.out.println("TOuch outside the dialog ******************** ");
this.dismiss();
}
return false;
}
자세한 내용 은 터치 포인트를 기반으로 사용자 정의 대화 상자 를 해제 하는 방법을 참조하십시오 . 그리고 이 아닌 모달 대화 상자를 닫으려면 어떻게 외부의 대화 영역을 만졌을 때
간단히 사용
dialog.setCanceledOnTouchOutside(true);
이 onTouchEvent 구현을 사용할 수 있습니다. 터치 이벤트에 대한 활동 아래에서 반응하는 것을 방지합니다 (Howettl 언급).
@Override
public boolean onTouchEvent ( MotionEvent event ) {
// I only care if the event is an UP action
if ( event.getAction () == MotionEvent.ACTION_UP ) {
// create a rect for storing the window rect
Rect r = new Rect ( 0, 0, 0, 0 );
// retrieve the windows rect
this.getWindow ().getDecorView ().getHitRect ( r );
// check if the event position is inside the window rect
boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
// if the event is not inside then we can close the activity
if ( !intersects ) {
// close the activity
this.finish ();
// notify that we consumed this event
return true;
}
}
// let the system handle the event
return super.onTouchEvent ( event );
}
출처 : http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html
이 방법은 클릭 이벤트를 검색하는 회색 영역 아래의 활동을 완전히 피해야합니다.
이 줄이 있으면 제거하십시오 .
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
이것을 당신의 활동에 올려 놓으십시오
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
그런 다음 터치 이벤트를 재정의하십시오.
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
displayYourDialog();
return false; // stop activity closing
}
}
// Touch events inside are fine.
return super.onTouchEvent(ev);
}
이 코드는 softsoftput을 숨길 때 대화 상자를 클릭 할 때와 softinput과 대화 상자가 모두 닫히는 대화 상자의 바깥 쪽을 클릭 할 때 사용됩니다.
dialog = new Dialog(act) {
@Override
public boolean onTouchEvent(MotionEvent event) {
// Tap anywhere to close dialog.
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) event.getX(),
(int) event.getY())) {
// You have clicked the grey area
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
dialog.dismiss();
// stop activity closing
} else {
InputMethodManager inputMethodManager = (InputMethodManager) act
.getSystemService(act.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(dialog
.getCurrentFocus().getWindowToken(), 0);
}
return true;
}
};
또 다른 해결책,이 코드는 안드로이드 소스 코드에서 가져온 것입니다. Window
이 두 가지 방법을 대화 상자 소스 코드에 추가해야합니다.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) {
hide();
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
이 솔루션에는 다음과 같은 문제가 없습니다.
아래 활동이 터치 이벤트에 반응한다는 점을 제외하고는 효과적입니다. 이것을 막을 방법이 있습니까? – howettl
다음은 나를 위해 일했습니다.
myDialog.setCanceledOnTouchOutside(true);
여기 코드가 있습니다
dialog.getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
if(MotionEvent.ACTION_DOWN == ev.getAction())
{
Rect dialogBounds = new Rect();
dialog. getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// You have clicked the grey area
UiUtils.hideKeyboard2(getActivity());
return false; // stop activity closing
}
}
getActivity().dispatchTouchEvent(ev);
return false;
}
});
이거 한번 해봐 . 외부를 만질 때 키보드를 숨길 수 있습니다