외부 활동시 Android 활동 대화 상자가 닫히지 않도록 방지


228

Theme.Dialog 스타일을 사용하는 활동이있어 다른 활동 위에 떠있는 창입니다. 그러나 백그라운드 활동에서 대화 상자 창 외부를 클릭하면 대화 상자가 닫힙니다. 이 행동을 어떻게 막을 수 있습니까?


1
왜 그렇게하세요 원하는 동작이 대화 인 경우 대화 상자를 사용하지 않는 이유는 무엇입니까? 귀하의 질문에 관해서는, 그에 대한 해결책이 없다고 생각합니다.
Kumar Bibek

@KumarBibek 대화 상자는 레이아웃 사용자 정의와 관련하여 제한되어 있습니다. 이것이 바로 활동입니다. 개발자 문서조차도 유연한 사용자 지정을 위해이 접근 방식을 권장합니다
Leo

1
OP가 원하는 것은 모달 대화 상자, 즉 사용자가 확인 또는 예 / 아니요와 같이 응답하도록하는 대화 상자입니다. 사용자는 클릭하기 만하면 안됩니다.
Scott Biggs

답변:


33

이것은 당신을 도울 수 있습니다. 외부 이벤트를 처리하는 방법입니다.

창 밖에서 터치했을 때 활동과 같은 대화 상자를 취소하는 방법은 무엇입니까?

이벤트를 잡아서 아무것도하지 않으면 폐막을 막을 수 있다고 생각합니다. 그러나 이상한 생각이 무엇인지, 활동 대화 상자의 기본 동작을해야한다는 것입니다 하지 당신이 외부 터치하면 자체를 닫습니다.

(PS : 코드는 WindowManager.LayoutParams를 사용합니다)


1
객체는 대화 상자가 아니며 대화 스타일을 사용하는 활동입니다. 활동에는이 방법이 없으며 대화 상자로 캐스트 할 수 없습니다.
Fergusmac

ur 포스트는 요청 된 것과 정확히 반대입니다. 그는 그것을 막는 방법이 아닌 폐쇄를 막는 방법을 물었다.
ChuckKelly

4
그가 "이벤트를 잡아서 아무것도하지 않으면 서, 결말을 막을 수 있다고 생각합니다."
metter

4
어떤 이유로 든 FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH 전체를 수행 한 후에 외부 터치는 실제로 활동을 닫지 않지만 활동 뒤의 단추를 클릭합니다. 그것에 대한 어떤 생각?
njzk2

대화 상자에는 그림자가 있습니다 (최소한 지금까지 (8.0)). 그림자를 클릭하면 Android는 대화 상자 안에있는 것처럼 클릭을 해석합니다. 이 정보를 세상과 공유하고 싶었습니다. 그것을 얻는 데 10 분이 걸렸습니다.
Lorenzo Von Matterhorn

458

뒤로 키를 눌렀을 때 대화 상자가 사라지는 것을 방지하려면 이것을 사용하십시오

dialog.setCancelable(false);

외부 터치에서 대화 상자가 사라지는 것을 방지하려면 이것을 사용하십시오.

 dialog.setCanceledOnTouchOutside(false);

4
이 답변은 도움이되지만이 질문은 Theme.Dialog 속성을 사용한 활동에 관한 것입니다.
Paresh Mayani

15
많은 사람들을 돕기 때문에 너무 늦었다는 것을 알게되면 삭제하지 않았습니다.
Singhak

12
나는 이것이 실제로 질문과 관련이 없다는 것을 알고 있지만 이것은 나를 도왔다. 감사!
dennisdrew 님이

5
이것이 가장 좋은 대답입니다. 나는 이 질문을 찾는 대부분 의 사람들이 표준 AlertDialog이 외부와 접촉 하지 못하게하는 방법을 찾고 있다고 생각 합니다.이 답변이 제공합니다.
aroth

20
최신 버전의 AlertDialog에서는 다음을 사용해야합니다.setCancelable(false)
Kobi Tate

120

실제로 가지고있는 것은 활동 (대화 상자처럼 보이더라도)이므로 setFinishOnTouchOutside(false)배경 활동을 클릭 할 때 활동을 유지하려면 활동에서 전화해야합니다 .

편집 : 이것은 안드로이드 API 레벨 11 이상에서만 작동합니다


4
이것은 활동에서 "뒤로"버튼을 누르는 것을 막지 않습니다. 당신은 또한 오버라이드 (override) 할 필요가 그래서 onBackPressed()그것의 몸에 아무것도하지 않고
알렉스 Bonel

onBackPressed ()없이 해당 대화 상자 활동에서 "뒤로"단추를 막지 않습니다. this.setFinishOnTouchOutside (false)와 완벽하게 작동합니다.
Kunalxigxag

68

나를 위해 일한 DialogFragment것은 취소 할 수없는 세트 를 만드는 것이 었습니다 .

dialog.setCancelable(false);

1
도움이되지 않습니다. 이 질문은 대화가 아닌 활동에 관한 것입니다.
Scott Biggs

20

onCreate에서 대화 상자를 활동으로 사용할 때 이것을 추가하십시오.

setFinishOnTouchOutside(false);

17

API 10이 높은 경우 외부를 터치하면 대화 상자가 사라지고 API 11보다 낮은 경우 대화 상자가 사라지지 않습니다. 이를 방지하려면 다음을 수행해야합니다.

에서 styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

또는

에서 onCreate()방법을 사용합니다 :this.setFinishOnTouchOutside(false);

참고 : API 10 이하의 경우이 방법은 적용되지 않으며 필요하지 않습니다.


14

대화 상자를 취소 가능으로 설정하면 충분하며 경고 대화 상자 외부를 터치하거나 뒤로 버튼을 클릭하면 경고 대화 상자가 사라집니다. 따라서 이것을 사용하십시오 :

setCancelable(false)

그리고 다른 기능은 더 이상 필요하지 않습니다. dialog.setCanceledOnTouchOutside(false);

임시 대화 상자를 만들고이 코드 줄을 작성해야한다면 다음 예를 참조하십시오.

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

12

이 코드를 사용하십시오.

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);


그가 올바른 질문을 할 수 있다면 이것은 정답이어야합니다!
alijunior

2
OP가 대화 에 대해 묻는다면 이것이 정답입니다 ! 그러나 문제는 활동에 관한 것입니다.
Scott Biggs

11
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

대화에 대한 자세한 내용은이 링크를 참조하십시오 .

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

이 질문은 Dialog 클래스가 아니라 대화 상자로 사용되는 활동과 관련이 있습니다.
Scott Biggs

8

간단히,

alertDialog.setCancelable(false);

사용자가 대화 상자 외부를 클릭하지 못하게합니다.


6

Alert Dialog는 사용되지 않으므로 Dialog dialog = new Dialog (this);

외부 접촉시 밀착 방지

dialog.setCanceledOnTouchOutside(false);

5

setFinishOnTouchOutside(false)API> 11에 사용 하고 활동 테마 대화 상자 인 Android의 기본 동작이 API <11 : 외부 터치에서 끝나지 않기 때문에 걱정하지 마십시오.


5

나는 이것을 onCreate ()에서 사용하며 모든 버전의 Android에서 작동하는 것 같습니다. 5.0 및 4.4.x에서 테스트되었지만 Gingerbread에서는 테스트 할 수 없습니다. Samsung 장치 (GB 1을 실행하는 주)는 기본적으로 다음과 같은 방식으로 작동합니다.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);

4
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

나는 이것이 당신을 도울 것이라고 생각합니다.


1
왜 이것이 효과가 있는지 설명해보십시오 ... 코드 덤프만으로는 좋은 대답이 아닙니다.
Codebender

3

내 해결책은 다음과 같습니다.

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);

2

onCancelListener를 구현하는 다른 액션을 할당 할 수도 있습니다.

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

경고 대화 상자 외부를 탭하여 취소가 호출되는지 어떻게 식별합니까?
cegprakash

경고 대화 상자 외부를 탭할 때 사용자 지정 작업을 만드는 데 매우 유용합니다!
Adam S.

1

나는 같은 문제에 직면했다. 그것을 처리 OntouchListener하기 위해 대화 상자에 a 를 설정하고 내부에서 아무것도하지 않습니다. 그러나 화면을 회전하면 대화 상자가 사라집니다. 이 문제를 해결하기 위해 대화 상자가 정상적으로 닫혔는지 알려주는 변수를 설정했습니다. 그런 다음 a OnDismissListener를 대화 상자로 설정 하고 내부에서 변수를 확인합니다. 대화 상자가 정상적으로 닫히면 아무 것도 말하지 않거나 대화 상자를 다시 실행합니다 (내 경우에는 닫을 때와 같이 상태를 설정).


1

builder.setCancelable (false);


공공 무효 멘사 제 (View v) {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

1
알렉스 안녕하세요. StackOverflow에 오신 것을 환영합니다. 답변 해 주셔서 감사합니다. 코드의 기능과 이것이 OP의 문제를 어떻게 해결하는지 설명하기 위해 답을 편집 해 주시겠습니까? 이유 만 가르치거나 설명하지 않기 때문에 코드 만 답변하지 않는 것이 좋습니다 . 감사합니다!
팀 말론

-1

이것은 모든 질문에 대한 완벽한 답변입니다 ... 안드로이드 코딩을 즐기시기 바랍니다

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();

이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 왜 이것이 문제에 대한 좋은 해결책인지를 보여줌으로써 장기적인 가치를 크게 향상시키고 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 가정을 포함하여 설명을 추가하려면 답변을 수정하십시오.
막시밀리안 피터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.