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.