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

104

Я работаю в приложении для Android и использую DialogFragment для отображения диалогового окна, и я хочу, чтобы этот DialogFragment нельзя было отменить. Я установил для свойства cancelable диалогового окна значение 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;
    }
 }
Арун
источник
29
вместо getDialog (). setCancelable (false); вы должны вызвать setCancelable (false);
Blackbelt
если щелкнуть за пределами диалогового окна, он также должен быть удален?
Усман Курд
Вы пробуете сэндвич с мороженым? Пожалуйста, перейдите
Реммиабхаван

Ответы:

243
@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 05
7
Это не подсказка. Фрагмент завершает ваш диалог, это нормально, что вам приходится иметь дело с фрагментом, а не с самим диалогом;)
andrea.rinaldi
1
Если вы не переопределяете onCreateView, setCancelable (false) также может быть вызван из общедоступного диалога onCreateDialog (Bundle savedInstanceState)
user2924714
2
У меня не работает. Диалог по-прежнему закрывается при нажатии кнопки «Назад».
Пинкеш Дарджи
@Blackbelt У меня есть аналогичный вариант использования, но в моем случае прикосновение за пределами диалогового окна не закрывает диалоговое окно. Я использую DatePicker в DialogFragment. Что бы я использовал для R.layout.dialog_test в вашем ответе выше? Мой полный вопрос указан здесь: stackoverflow.com/questions/59825258/…
AJW
53

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

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
Это должен быть принятый ответ, поскольку он применим как к фрагментам диалогового окна обычных предупреждений, так и к фрагментам настраиваемого диалогового окна.
Ганеш Мохан
29

Если вы используете построитель предупреждений (и, вероятно, в каждом случае вы обертываете диалог внутри 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;
}
Ксенион
источник
Да, я пробую вышеуказанное решение, даже проверенное, но не работает для меня, этот ответ новый, поэтому нужно время, чтобы проголосовать за него, в любом случае спасибо.
Xenione
Что ж, это правда, даже если я думаю, что такое поведение со стороны Android довольно странно, поскольку вы явно используете, например, AlertDialog.Builder для создания своего диалога, вы можете подумать, что эти атрибуты переопределяют подклассы. Но, может быть, я что-то здесь упускаю?
Роберт
Я думаю, что поведение диалога после того, как оно было заключено в диалог, больше не реагирует на AlertDialog или, по крайней мере, в большой степени. Я думаю, что вместо этого все проходит через fragmentDialog.
Xenione
Спасибо! Я все это время использовал alert.setCancelable (false) и не мог понять, почему это не сработает.
Aldo
1

Простое решение в DialogFragment

Используемый

dialog.setCanceledOnTouchOutside(false)
Мирза Адиль
источник