대화 상자 외부를 누를 때 DialogFragment를 닫는 방법은 무엇입니까?


80

를 사용 DialogFragment하고 있으며 눌렀을 때 대화 상자를 닫도록 (즉, 닫기) 이미지를 성공적으로 설정했지만 사용자가 대화 상자 외부를 클릭 할 때 대화 상자를 닫는 방법을 찾기가 어렵습니다. 일반 대화. 나는 일종의

dialogFragment.setCanceledOnTouchOutside(true);

전화했지만 문서에는 보이지 않습니다.

이것이 가능 DialogFragment합니까? 아니면 잘못된 곳을 찾고 있습니까? 나는 '부모'활동에서 터치 이벤트를 가로 채려고했지만 터치 이벤트가없는 것 외에는 나에게 옳지 않은 것 같았다.

답변:


177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

반드시 호출되어야합니다 onCreateView(Apurv Gupta가 지적했듯이).


34
전화해야합니다onCreateView
Apurv Gupta 2014

취소하지 않고 그냥 닫으면 어떻게 되나요?
jjxtra

58
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }

в моем случае getDialog (). setCanceledOnTouchOutside (true); не сработало, сработало getDialog (). dismiss ();
Максим Фомичёв

@ МаксимФомичёв, в первом случае происходит установка свойства диалога, что его можно закрывать нажатием снаружи. Во втором случае вы сами программно закрываете диалог.
CoolMind

21
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }

이것은 나를 위해 작동하지 않았습니다. @Apurv setCanceledOnTouchOutsideonCreateView따라 전화 를 걸어야했습니다. 나는라고 언급해야setCanceledOnTouchOutside(false)
kimbaudi

8

여기에 많은 답변이 있지만 대화 상자가 열리면 앱이 충돌합니다. getDialog().setCanceledOnTouchOutside(true);내부 쓰기onCreateView 가 작동하지 않고 내 앱이 충돌했습니다.

(저는 AppCompatActivityBaseActivity로 사용하고 있으며android.app.DialogFragment Fragment로 사용하고 있습니다).

작동하는 것은 다음 두 줄 중 하나입니다.

getDialog (). setCanceledOnTouchOutside (true);

또는

this.getDialog (). setCanceledOnTouchOutside (true);

onActivityCreated같은 내부

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

사용하지 말아야 할 것 :

DialogFragment.getDialog (). setCanceledOnTouchOutside (false);

다음 오류가 발생합니다.

여기에 이미지 설명 입력

그리고 코드를 작성하면 onCreateView앱이 충돌합니다! 잘못된 것을 찾으면 답변을 업데이트하십시오.


아마도 이것은 onCreateDialog()일반적인 초기화 방법 인에서 대화 상자를 생성했기 때문일 것 입니다. 이 경우 onCreateView()아무 작업도 수행하지 않으며보기도 포함하지 않습니다. 코드를 onCreateDialog().
CoolMind

@CoolMind 오, 좋은 관찰입니다. 내 시도 목록에 확실히 보관할 것입니다. 감사!
sud007

그럼에도 불구하고 당신의 대답은 말이되고 4 명이 플러스를 표시했다고 생각합니다. 또한 문제를 경험 onCreateDialog, onCreateView가까운 과거에. 내가 틀렸을 수도 있고 유지해야합니다 onActivityCreated. 추가 초기화를 수행하는 좋은 방법 입니다 (예를 들어 stackoverflow.com/a/50734566/2914140 참조 ).
CoolMind

@CoolMind는 당신을 위해 작동합니다. 그러나 귀하가 겪고있는 문제는 귀하의 BottomSheet구현으로 인한 것임을 알 수 있습니다 . 동의하는 BSheet의 경우 다를 수 있습니다. 그러나이 솔루션은 DialogFragment잘 작동합니다.
sud007 19-04-22

3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

오해였다. 나는 같은 문제가 있었다. 이것은 Java에서 잘 작동하고 Android Mono의 Mono는 다음과 같습니다.

this.getDialog().SetCanceledOnTouchOutside(false);

하지만 Mono에 대해 누가 물어 보셨습니까? : /
m0skit0

1
            Dialog.SetCanceledOnTouchOutside(true);

나를 위해 일했다
내 코드

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }

1

외부를 클릭 할 때 일부 논리를 실행 DialogFragment하려면 onCancel 메서드를 재정의하면됩니다.

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}

0

위의 솔루션을 시도한 후에 만 ​​솔루션을 사용하는 것이 좋습니다. 여기에 내 솔루션을 설명 했습니다 . 간단히 말해서 DialogFragment.getView ()의 터치 경계를 확인하고 있습니다. 터치 포인트가 DialogFragment 밖에 있으면 Dialog를 닫습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.