Cegah dialog aktivitas Android dari penutupan pada sentuhan luar

229

Saya memiliki aktivitas yang menggunakan gaya Theme.Dialog sehingga merupakan jendela mengambang di atas aktivitas lain. Namun, ketika saya mengklik di luar jendela dialog (pada aktivitas latar belakang), dialog ditutup. Bagaimana saya bisa menghentikan perilaku ini?

Fergusmac
sumber
1
Mengapa Anda melakukan itu btw. JIKA perilaku yang Anda inginkan adalah dialog, mengapa tidak menggunakan dialog? Datang ke pertanyaan Anda, saya tidak berpikir ada solusi untuk itu.
Kumar Bibek
Dialog @KumarBibek terbatas ketika datang ke kustomisasi tata letak ... itu sebabnya suatu kegiatan. Bahkan dokumen pengembang merekomendasikan pendekatan ini untuk penyesuaian yang fleksibel
Leo
1
Dan yang diinginkan OP adalah dialog Modal , yaitu dialog yang memaksa pengguna merespons, seperti OK, atau Ya / Tidak. Pengguna seharusnya tidak bisa mengklik saja.
Scott Biggs

Jawaban:

34

Ini bisa membantu Anda. Ini adalah cara untuk menangani sentuhan di luar acara:

Bagaimana cara membatalkan Dialog bertema Aktivitas seperti ketika disentuh di luar jendela?

Dengan menangkap acara dan tidak melakukan apa pun, saya pikir Anda dapat mencegah penutupan. Namun yang aneh adalah, perilaku default dialog aktivitas Anda seharusnya tidak menutup sendiri ketika Anda menyentuh luar.

(PS: kodenya menggunakan WindowManager.LayoutParams)

Michel-F. Portzert
sumber
1
Objeknya bukan dialog, ini adalah Aktivitas yang menggunakan gaya dialog. Aktivitas tidak memiliki metode ini, dan tidak dapat dilemparkan ke Dialog.
Fergusmac
posting Anda adalah kebalikan dari apa yang diminta. dia bertanya bagaimana mencegah penutupan bukan bagaimana menyebabkannya.
ChuckKelly
4
Itulah yang dia jelaskan dengan "Dengan menangkap acara dan tidak melakukan apa pun, saya pikir Anda dapat mencegah penutupan"
metter
4
untuk beberapa alasan, setelah melakukan seluruh FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH, sentuhan luar itu ternyata tidak menutup aktivitas, tetapi tombol di belakang aktivitas diklik. ada ide untuk itu?
njzk2
Perhatikan bahwa Dialog memiliki bayangan (setidaknya sampai sekarang (8.0)): jika Anda mengklik bayangan, Android akan mengartikan klik itu persis seperti yang ada di dalam dialog. Hanya ingin berbagi ini dengan dunia, butuh 10 menit untuk mendapatkannya.
Lorenzo Von Matterhorn
458

Untuk mencegah kotak dialog dibubarkan dengan tombol kembali ditekan, gunakan ini

dialog.setCancelable(false);

Dan untuk mencegah kotak dialog dibubarkan pada sentuhan luar gunakan ini

 dialog.setCanceledOnTouchOutside(false);
Singhak
sumber
4
Jawaban ini bermanfaat tetapi pertanyaan ini tentang aktivitas yang menggunakan atribut Theme.Dialog.
Paresh Mayani
15
Saya tahu ketika saya menyadari sudah terlambat karena itu membantu banyak orang sehingga tidak menghapusnya.
Singhak
12
Saya tahu ini tidak benar-benar berkaitan dengan pertanyaan, tetapi ini membantu saya. Terima kasih!
dennisdrew
5
Ini jawaban terbaik. Saya menduga sebagian besar orang yang menemukan pertanyaan ini mencari cara untuk mencegah standar AlertDialogmenutup sentuhan di luar, dan itulah yang diberikan jawaban ini.
aroth
20
Pada versi AlertDialog yang lebih baru, Anda hanya perlu menggunakansetCancelable(false)
Kobi Tate
120

Apa yang sebenarnya Anda miliki adalah sebuah Aktivitas (walaupun itu terlihat seperti Dialog), oleh karena itu Anda harus menelepon setFinishOnTouchOutside(false)dari aktivitas Anda jika Anda ingin tetap terbuka ketika aktivitas latar belakang diklik.

EDIT: Ini hanya berfungsi dengan API Android level 11 atau lebih tinggi

artex
sumber
4
Ini tidak mencegah Anda menekan tombol "kembali" dalam aktivitas Anda. Jadi Anda juga perlu mengesampingkan onBackPressed()tidak melakukan apa pun di tubuh itu
Alex Bonel
Itu tidak mencegah tombol "kembali" dalam Aktivitas dialog tanpa onBackPressed (). Berfungsi sempurna dengan this.setFinishOnTouchOutside (false).
Kunalxigxag
68

Apa yang berhasil bagi saya adalah membuat DialogFragmentset agar tidak dapat dibatalkan:

dialog.setCancelable(false);
Petr
sumber
1
Tidak membantu. Pertanyaan ini tentang Aktivitas, bukan Dialog.
Scott Biggs
20

Saat menggunakan dialog sebagai aktivitas di onCreate, tambahkan ini

setFinishOnTouchOutside(false);
Ronny Shibley
sumber
17

Untuk API 10 yang lebih tinggi, Dialog menghilang ketika disentuh di luar, sedangkan di bawah API 11, Dialog tidak menghilang. Untuk mencegahnya, Anda perlu melakukan:

Dalam styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

ATAU

Dalam onCreate()metode, gunakan:this.setFinishOnTouchOutside(false);

Catatan: untuk API 10 dan lebih rendah, metode ini tidak memiliki efek, dan tidak diperlukan.

ilw
sumber
14

Mengatur dialog yang dapat dibatalkan menjadi salah sudah cukup, dan Anda menyentuh di luar dialog peringatan atau mengklik tombol kembali akan membuat dialog peringatan menghilang. Jadi gunakan yang ini:

setCancelable(false)

Dan fungsi lainnya tidak diperlukan lagi: dialog.setCanceledOnTouchOutside(false);

Jika Anda membuat dialog sementara dan bertanya-tanya di sana untuk meletakkan baris kode ini, berikut ini sebuah contoh:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();
BillOverFlow
sumber
12

Gunakan Kode Ini Berfungsi untukku

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);

Aslam Patel
sumber
ini harus menjadi jawaban yang benar, jika dia bisa melakukan pertanyaan yang benar!
alijunior
2
Ini akan menjadi jawaban yang benar, jika OP bertanya tentang dialog ! Tetapi pertanyaannya adalah tentang Kegiatan - kasus yang sangat berbeda.
Scott Biggs
11
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

Tonton tautan ini untuk detail lebih lanjut tentang dialog.

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity
anand krish
sumber
Harap dicatat bahwa pertanyaan tersebut berkaitan dengan Aktivitas yang digunakan sebagai dialog, BUKAN kelas Dialog.
Scott Biggs
8

Secara sederhana,

alertDialog.setCancelable(false);

mencegah pengguna mengklik di luar Kotak Dialog.


sumber
7

Dialog Peringatan tidak digunakan lagi, jadi gunakan Dialog dialog = Dialog baru (ini);

Untuk mencegah menutup pada sentuhan luar

dialog.setCanceledOnTouchOutside(false);
Muhamad Fasil
sumber
5

Gunakan setFinishOnTouchOutside(false)untuk API> 11 dan jangan khawatir karena perilaku default Android-nya bahwa dialog bertema aktivitas tidak akan selesai pada sentuhan luar untuk API <11 :) !! Cheerss !!

Vishal Pandey
sumber
5

Saya menggunakan ini di onCreate (), tampaknya berfungsi pada semua versi Android; diuji pada 5.0 dan 4.4.x, tidak dapat menguji pada Gingerbread, perangkat Samsung (Catatan 1 menjalankan GB) memilikinya dengan cara ini secara default:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);
3c71
sumber
4
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

Saya kira ini akan membantu Anda. Ini berhasil bagi saya

pengguna2532065
sumber
1
Tolong juga coba jelaskan mengapa ini akan berhasil ... Hanya dump kode bukan jawaban yang baik.
Codebender
3

Ini solusinya:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
Akhter Al Amin
sumber
2

Juga dimungkinkan untuk menetapkan tindakan berbeda yang mengimplementasikan onCancelListener:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});
Adae Rodríguez
sumber
Bagaimana saya bisa mengidentifikasi jika pembatalan dipanggil karena mengetuk di luar dialog peringatan?
cegprakash
Sangat membantu untuk membuat tindakan khusus pada mengetuk di luar dialog peringatan!
Adam S.
1

Saya menghadapi masalah yang sama. Untuk menanganinya, saya mengatur a OntouchListenerke dialog dan tidak melakukan apa pun di dalam. Tapi Dialog menampik ketika memutar layar juga. Untuk memperbaikinya saya menetapkan variabel untuk memberi tahu saya jika dialog biasanya ditolak. Kemudian saya mengatur OnDismissListenerdialog saya dan di dalamnya saya memeriksa variabel. Jika dialog telah dismmiss biasanya saya tidak melakukan apa-apa, atau saya menjalankan dialog lagi (dan mengatur statusnya seperti ketika menolak dalam kasus saya).

Madara
sumber
1

builder.setCancelable (false);


public void Mensaje (Lihat v) {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}
Alex Skriivordemgentschenfelde
sumber
1
Hai Alex. Selamat datang di StackOverflow dan terima kasih atas jawaban Anda. Bisakah Anda mengedit jawaban Anda untuk menggambarkan apa yang kode Anda lakukan dan bagaimana ini memecahkan masalah OP? Kode hanya jawaban tidak disarankan karena mereka tidak mengajarkan atau menjelaskan alasannya . Terima kasih!
Tim Malone
-1

Ini adalah jawaban sempurna untuk semua pertanyaan Anda .... Semoga Anda menikmati pengkodean di Android

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();
Akshat Rasogi
sumber
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Maximilian Peters