Tôi có một hoạt động đang sử dụng kiểu Theme.Dialog sao cho nó là một cửa sổ nổi trên một hoạt động khác. Tuy nhiên, khi tôi nhấp bên ngoài cửa sổ hộp thoại (trên hoạt động nền), hộp thoại sẽ đóng lại. Làm thế nào tôi có thể ngăn chặn hành vi này?
Tôi có một hoạt động đang sử dụng kiểu Theme.Dialog sao cho nó là một cửa sổ nổi trên một hoạt động khác. Tuy nhiên, khi tôi nhấp bên ngoài cửa sổ hộp thoại (trên hoạt động nền), hộp thoại sẽ đóng lại. Làm thế nào tôi có thể ngăn chặn hành vi này?
Câu trả lời:
Điều này có thể giúp bạn. Đó là một cách để xử lý cảm ứng bên ngoài sự kiện:
Làm cách nào để hủy Hộp thoại theo chủ đề như Hoạt động khi được chạm bên ngoài cửa sổ?
Bằng cách bắt sự kiện và không làm gì, tôi nghĩ bạn có thể ngăn chặn việc đóng cửa. Nhưng dù lạ là gì, đó là hành vi mặc định của hộp thoại hoạt động của bạn nên không để tự đóng khi bạn chạm vào bên ngoài.
(PS: mã sử dụng WindowManager.LayoutParams)
Để ngăn hộp thoại không bị tắt trên phím back, hãy sử dụng
dialog.setCancelable(false);
Và để ngăn hộp thoại bị loại bỏ khi chạm vào bên ngoài, hãy sử dụng
dialog.setCanceledOnTouchOutside(false);
AlertDialog
đóng cửa bên ngoài và đó là những gì câu trả lời này cung cấp.
setCancelable(false)
Những gì bạn thực sự có là một Hoạt động (ngay cả khi nó trông giống như Hộp thoại), do đó bạn nên gọi setFinishOnTouchOutside(false)
từ hoạt động của mình nếu bạn muốn giữ cho nó mở khi hoạt động nền được nhấp.
EDIT: Điều này chỉ hoạt động với API Android cấp 11 trở lên
onBackPressed()
không làm gì trong cơ thể
Điều làm việc cho tôi là tạo ra DialogFragment
một tập hợp thành không thể hủy được:
dialog.setCancelable(false);
Khi sử dụng hộp thoại làm hoạt động trong onCreate, hãy thêm
setFinishOnTouchOutside(false);
Đối với API 10 cao hơn, Hộp thoại biến mất khi chạm vào bên ngoài, trong khi ở mức thấp hơn API 11, Hộp thoại không biến mất. Để ngăn chặn điều này, bạn cần làm:
Trong styles.xml
:<item name="android:windowCloseOnTouchOutside">false</item>
HOẶC LÀ
Trong onCreate()
phương pháp, sử dụng:this.setFinishOnTouchOutside(false);
Lưu ý: đối với API 10 trở xuống, phương pháp này không có hiệu lực và không cần thiết.
Đặt hộp thoại có thể hủy thành sai là đủ và bạn chạm vào bên ngoài hộp thoại cảnh báo hoặc nhấp vào nút quay lại sẽ làm cho hộp thoại cảnh báo biến mất. Vì vậy, sử dụng cái này:
setCancelable(false)
Và chức năng khác là không cần thiết nữa:
dialog.setCanceledOnTouchOutside(false);
Nếu bạn đang tạo một hộp thoại tạm thời và tự hỏi để đặt dòng mã này, đây là một ví dụ:
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();
Sử dụng mã này nó hoạt động cho tôi
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setCancelable(false);
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.
Xem liên kết này để biết thêm chi tiết về hộp thoại.
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
Đơn giản,
alertDialog.setCancelable(false);
ngăn người dùng nhấp vào bên ngoài Hộp thoại.
Hộp thoại cảnh báo không được dùng nữa nên sử dụng hộp thoại Hộp thoại = hộp thoại mới (cái này);
Để ngăn chặn sự đụng chạm bên ngoài
dialog.setCanceledOnTouchOutside(false);
Sử dụng setFinishOnTouchOutside(false)
cho API> 11 và đừng lo lắng vì hành vi mặc định của Android mà hộp thoại theo chủ đề hoạt động sẽ không kết thúc khi chạm bên ngoài cho API <11 :) !! Chúc mừng !!
Tôi sử dụng điều này trong onCreate (), dường như hoạt động trên mọi phiên bản Android; đã thử nghiệm trên 5.0 và 4.4.x, không thể kiểm tra trên Gingerbread, các thiết bị Samsung (Lưu ý 1 đang chạy GB) theo cách này theo mặc định:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
setFinishOnTouchOutside(false);
}
else
{
getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
}
super.onCreate(savedInstanceState);
alert.setCancelable(false);
alert.setCanceledOnTouchOutside(false);
Tôi đoán điều này sẽ giúp bạn. Nó làm việc cho tôi
Đây là giải pháp của tôi:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
Cũng có thể chỉ định hành động thực hiện khác nhau trên HủyListListener:
alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
@Override
public void onCancel(DialogInterface dialogInterface) {
//Your custom logic
}
});
Tôi đã phải đối mặt với cùng một vấn đề. Để xử lý nó, tôi đặt một OntouchListener
hộp thoại và không làm gì bên trong. Nhưng Dialog bỏ qua khi xoay màn hình quá. Để khắc phục, tôi đặt một biến để cho tôi biết nếu hộp thoại thường bị loại bỏ. Sau đó, tôi đặt một OnDismissListener
hộp thoại của mình và bên trong tôi kiểm tra biến. Nếu hộp thoại không hoạt động bình thường thì tôi không biết, nếu không tôi sẽ chạy lại hộp thoại (và đặt trạng thái của anh ấy như khi bỏ qua trong trường hợp của tôi).
builder.set Hủy được (sai);
công khai Mensaje (Xem 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();
}
Đây là câu trả lời hoàn hảo cho tất cả các câu hỏi của bạn .... Hy vọng bạn thích mã hóa trong 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();