Властивість DialogFragmentCCableble не працює


102

Я працюю в додатку для android і використовую DialogFragment для показу діалогового вікна, і я хочу зробити так, щоб DialogFragment не можна було скасувати. Я зробив властивість діалогового відмінювання неправдивим, але все одно це не впливає.

Будь ласка, загляньте в мій код і запропонуйте мені рішення.

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);
Блекбелт

якщо ви натиснете за межі діалогового вікна, його також слід відхилити?
Усман Курд

Відповіді:


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 (помилковий) також може бути викликаний із загальнодоступного діалогу onCreateDialog (Пакет збереженийInstanceState)
користувач2924714

2
Не працює для мене. Діалог все ще отримує відмову від натискання кнопки "назад".
Pinkesh Darji

@Blackbelt У мене є подібний випадок використання, але в моєму випадку дотик поза діалогом не відхиляє діалог. Я використовую 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
Це має бути прийнятою відповіддю, оскільки вона застосовується як для фрагментів діалогу попередження ванілі, так і для власних фрагментів діалогу.
Ганеш Мохан

29

Якщо ви використовуєте конструктор сповіщень (і, мабуть, у кожному випадку ви загортаєте діалогове вікно всередині DialogFragment), щоб допомогти створити діалог, будь ласка, не використовуйте getDialog (). SetCancelable (false) або Dialog.setCancelable (false), оскільки це не буде робота. Використовуйте setCancelable (false), як показано в коді нижче, як це зазначено в офіційній документації на Android:

public void setCancelable (boolean cancelable)

Додано в рівень 11 API Контролюйте, чи можна скасувати показаний діалог. Використовуйте це замість прямого виклику Dialog.setCancelable (булева), оскільки 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;
}

Так, я спробував вище рішення, навіть перевірене, але не працює для мене, що відповідь є новим, тому потрібен час, щоб вимагати часу, дякую все одно.
Ксеніоне

Ну, це правда, навіть якщо я вважаю, що така поведінка з боку Android є досить дивним, оскільки ви явно використовуєте, наприклад, AlertDialog.Builder для створення діалогового вікна, ви вважаєте, що ці атрибути переосмислюють підкласи. Але я, можливо, чогось тут пропускаю?
Роберт

Я думаю, що поведінка діалогу після того, як він буде загорнутий у діалоговий фрагмент, вже не відповідає на AlertDialog або не є прискіпливим до великого. Я думаю, що все йде через fragmentDialog.
Ксеніоне

Дякую! Я все це використовував alert.setCancelable (помилково) і не міг зрозуміти, чому це не буде працювати.
Алдо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.