DialogFragment setCancelable 속성이 작동하지 않습니다.


102

Android 응용 프로그램에서 작업 중이며 DialogFragment를 사용하여 대화 상자를 표시하고 해당 DialogFragment를 취소 할 수 없도록 만들고 싶습니다. 대화 취소 가능 속성을 false로 만들었지 만 여전히 영향을 미치지 않습니다.

내 코드를 살펴보고 해결책을 제안하십시오.

public class DialogTest extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return super.onCreateDialog(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);

        return view;
    }
 }

28
getDialog (). setCancelable (false); 대신 setCancelable (false)을 호출해야합니다.
— Blackbelt

당신이 대화의 경계 밖을 클릭하면 그것은 또한 제거되어야합니까?
— Usman Kurd

답변:


238
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    getDialog().setCancelable(false);

    return view;
}

대신에 getDialog().setCancelable(false);직접 사용해야하는setCancelable(false);

업데이트 된 답변은 다음과 같습니다.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    setCancelable(false);

    return view;
}

정말 놀라운 팁입니다. 감사합니다. 왜 dialog.getWindow (). requestFeature (-) 를 사용하여 getWindow에 "대화 상자를 포함" 해야하는지 궁금 합니다.
— Fattie

7
팁이 아닙니다. 프래그먼트가 대화 상자를 감싸고 있습니다. 대화 자체 대신 프래그먼트를 처리해야하는 것은 정상입니다.)
— andrea.rinaldi

1
onCreateView를 재정의하지 않는 경우 setCancelable (false)을 공개 대화 상자 onCreateDialog (Bundle savedInstanceState)에서 호출 할 수도 있습니다.
— user2924714

2
나를 위해 일하지 않습니다. 뒤로 버튼을 클릭하면 대화 상자가 여전히 닫힙니다.
— Pinkesh Darji

@Blackbelt 비슷한 사용 사례가 있지만 제 경우에는 대화 상자 외부를 터치해도 대화 상자가 닫히지 않습니다. DialogFragment 내에서 DatePicker를 사용하고 있습니다. 위의 답변에서 "R.layout.dialog_test"에 무엇을 사용합니까? 내 전체 질문은 다음과 같습니다. stackoverflow.com/questions/59825258/…
— AJW

52

다음 스 니펫 사용

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}

대화 상자 주변의 외부 터치를 비활성화하려면 다음 코드 줄을 사용하십시오.

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
이것은 바닐라 경고 대화 조각과 사용자 지정 대화 조각 모두에 적용 가능하므로 허용되는 대답이어야합니다.
— Ganesh Mohan

29

도움말 빌드 귀하의 대화에 경우 당신은 경고 빌더를 사용하여 (아마 모든 경우에 당신이 DialogFragment 내부 대화 상자 포장). setCancelable (거짓)을 getDialog ()를 사용하지 않거나 Dialog.setCancelable (거짓)하십시오 이 가지 않을 있기 때문에 작업. oficial android 문서에 언급 된대로 아래 코드에 표시된대로 setCancelable (false)을 사용합니다.

public void setCancelable (boolean cancelable)

API 레벨 11에 추가됨 표시된 대화 상자를 취소 할 수 있는지 여부를 제어합니다. Dialog.setCancelable (boolean)을 직접 호출하는 대신 이것을 사용하십시오. DialogFragment는이를 기반으로 동작을 변경해야하기 때문입니다. "

참조 : http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.dialog_layout, null, false);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle("in case you want use a title").setView(view);

        AlertDialog alert = builder.create();
        // alert.setCancelable(false); <-- dont' use that instead use bellow approach
        setCancelable(false); <-  press back button not cancel dialog, this one works fine
        alert.setCanceledOnTouchOutside(false); <- to cancel outside touch

        return alert;
}

예, 위의 솔루션을 시도했지만 확인 된 솔루션도 나에게 적합하지 않습니다. 그 대답은 새롭기 때문에 투표 할 시간이 필요합니다. 어쨌든 감사합니다.
— Xenione

예를 들어 AlertDialog.Builder를 사용하여 대화 상자를 작성하기 때문에 Android 측에서이 동작이 매우 이상하다고 생각하더라도 해당 속성이 하위 클래스를 재정의한다고 생각할 수 있습니다. 하지만 여기서 뭔가 빠졌을까요?
— Robert

대화 조각에 래핑 된 후 대화 동작이 더 이상 AlertDialog에 응답하지 않거나 bigining에 응답하지 않는다고 생각합니다. 나는 모든 것이 fragmentDialog를 대신한다고 생각합니다.
— Xenione 2014 년

감사! 나는이 모든 동안 alert.setCancelable (false)을 사용하고 있었고 왜 작동하지 않는지 이해할 수 없었습니다.
— Aldo

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