Свойство DialogFragment setCancelable не работает

Я работаю в приложении Android и использую DialogFragment, чтобы показать диалог, и я хочу, чтобы этот диалог не был отменен. Я сделал свойство cancelable cancel равным 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;
    }
 }

Ответ 1

@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;
}

Ответ 2

Используйте следующий фрагмент

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

и если вы хотите отключить внешнее касание вокруг диалогового окна, используйте следующую строку кода

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Ответ 3

Если вы используете построитель предупреждений (и, вероятно, в каждом случае вы обмениваете диалог внутри диалогового окна DialogFragment), чтобы помочь вам создать диалог, не используйте getDialog(). setCancelable (false) или Dialog.setCancelable(false) потому что он не будет работать. Используйте setCancelable (false), как показано ниже в коде, как указано в официальной документации по Android:

public void setCancelable (boolean cancelable)

Добавлен в уровень API 11 Контролируйте отмену показанного диалога. Используйте это вместо прямого вызова Dialog.setCancelable(boolean), потому что DialogFragment должен изменить свое поведение на основе этого. "

ref: 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;
}