Properti DialogFragment setCancelable tidak berfungsi

102

Saya bekerja di aplikasi android dan menggunakan DialogFragment untuk menampilkan dialog dan saya ingin agar DialogFragment itu tidak dapat dibatalkan. Saya telah membuat properti dialog cancelable menjadi false, tetapi tetap tidak mempengaruhi.

Silakan lihat kode saya dan sarankan saya solusi.

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;
    }
 }
Arun
sumber
28
bukannya getDialog (). setCancelable (false); Anda harus memanggil setCancelable (false);
Blackbelt
jika Anda mengklik di luar batas dialog, itu juga harus disamarkan?
Usman Kurd
Apakah Anda mencoba sandwich es krim? Silakan merujuk ke tautan yang disebutkan fantasypublishings.com/morePhpHelp/…
Remmyabhavan

Jawaban:

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

alih-alih getDialog().setCancelable(false);Anda harus menggunakan secara langsungsetCancelable(false);

jadi jawaban yang diperbarui akan seperti ini

@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;
}
Sabuk hitam
sumber
Itu tip yang benar-benar luar biasa, TERIMA KASIH. Saya bertanya-tanya mengapa, dengan say dialog.getWindow (). RequestFeature (-) Anda harus "menyertakan dialog" di getWindow?
Fattie
7
Ini bukan tip. Fragmen membungkus dialog Anda, wajar jika Anda harus berurusan dengan fragmen, bukan dialog itu sendiri;)
andrea.rinaldi
1
Jika Anda tidak menimpa onCreateView, setCancelable (false) juga bisa dipanggil dari Dialog publik onCreateDialog (Bundle storedInstanceState)
user2924714
2
Tidak bekerja untuk saya. Dialog masih ditutup saat mengklik tombol kembali.
Pinkesh Darji
@Blackbelt Saya memiliki kasus penggunaan yang serupa tetapi dalam kasus saya sentuhan di luar dialog tidak menutup dialog. Saya menggunakan DatePicker dalam DialogFragment. Apa yang akan saya gunakan untuk "R.layout.dialog_test" dalam jawaban Anda di atas? Pertanyaan lengkap saya tercantum di sini: stackoverflow.com/questions/59825258/…
AJW
52

Gunakan Snippet berikut

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

dan jika Anda ingin menonaktifkan dialog sentuh di luar sisi gunakan baris kode berikut

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
Usman Kurd
sumber
1
Ini harus menjadi jawaban yang diterima karena berlaku untuk fragmen dialog peringatan vanilla dan fragmen dialog kustom.
Ganesh Mohan
29

Jika Anda menggunakan pembuat peringatan (dan mungkin dalam setiap kasus Anda membungkus dialog di dalam DialogFragment) untuk membantu membangun dialog Anda, jangan gunakan getDialog (). SetCancelable (false) atau Dialog.setCancelable (false) karena tidak akan kerja. Gunakan setCancelable (false) seperti yang ditunjukkan pada kode di bawah ini seperti yang disebutkan dalam dokumentasi resmi android:

public void setCancelable (boolean cancelable)

Ditambahkan dalam API level 11 Kontrol apakah Dialog yang ditampilkan dapat dibatalkan. Gunakan ini daripada langsung memanggil Dialog.setCancelable (boolean), karena DialogFragment perlu mengubah perilakunya berdasarkan ini. "

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
sumber
Ya saya mencoba solusi di atas, bahkan yang dicentang tetapi tidak berfungsi untuk saya, jawaban itu baru jadi perlu waktu untuk dipilih, Terima kasih.
Xenione
Ini benar, meskipun menurut saya perilaku dari sisi Android ini cukup aneh, karena Anda secara eksplisit menggunakan misalnya AlertDialog.Builder untuk membangun dialog Anda, Anda akan berpikir bahwa atribut tersebut menimpa subclass. Tapi saya mungkin melewatkan sesuatu di sini?
Robert
Saya pikir perilaku dialog setelah dibungkus dalam dialogfragment tidak menanggapi AlertDialog lagi atau setidaknya di bigining. Saya pikir semua melalui fragmentDialog sebagai gantinya.
Xenione
Terima kasih! Saya menggunakan alert.setCancelable (false) selama ini dan tidak mengerti mengapa itu tidak berhasil.
Aldo
0

Solusi Sederhana di DialogFragment

Bekas

dialog.setCanceledOnTouchOutside(false)
Mirza Adil
sumber