ฉันมีกิจกรรมที่ใช้สไตล์ Theme.Dialog ว่าเป็นหน้าต่างลอยเหนือกิจกรรมอื่น อย่างไรก็ตามเมื่อฉันคลิกนอกหน้าต่างข้อความ (ในกิจกรรมพื้นหลัง) กล่องโต้ตอบจะปิดลง ฉันจะหยุดพฤติกรรมนี้ได้อย่างไร
ฉันมีกิจกรรมที่ใช้สไตล์ Theme.Dialog ว่าเป็นหน้าต่างลอยเหนือกิจกรรมอื่น อย่างไรก็ตามเมื่อฉันคลิกนอกหน้าต่างข้อความ (ในกิจกรรมพื้นหลัง) กล่องโต้ตอบจะปิดลง ฉันจะหยุดพฤติกรรมนี้ได้อย่างไร
คำตอบ:
สิ่งนี้จะช่วยคุณได้ มันเป็นวิธีที่จะจัดการกับเหตุการณ์สัมผัสภายนอก:
วิธียกเลิก Dialog ที่มีธีมเช่นกิจกรรมเมื่อถูกสัมผัสนอกหน้าต่างได้อย่างไร?
ฉันคิดว่าคุณสามารถป้องกันการปิดได้ แต่สิ่งที่เป็น แต่ที่แปลกก็คือว่าการทำงานเริ่มต้นของการโต้ตอบกิจกรรมของคุณควรจะเป็นไม่ได้ที่จะปิดตัวเองเมื่อคุณสัมผัสนอก
(PS: รหัสใช้ WindowManager.LayoutParams)
เพื่อป้องกันไม่ให้กล่องโต้ตอบถูกไล่ออกจากปุ่มย้อนกลับกดใช้สิ่งนี้
dialog.setCancelable(false);
และเพื่อป้องกันกล่องโต้ตอบจากการถูกไล่ออกนอกสัมผัสใช้สิ่งนี้
dialog.setCanceledOnTouchOutside(false);
AlertDialog
ปิดการสัมผัสด้านนอกและนั่นคือสิ่งที่คำตอบนี้ให้
setCancelable(false)
สิ่งที่คุณมีจริง ๆ คือกิจกรรม (แม้ว่าจะดูเหมือนเป็นกล่องโต้ตอบ) ดังนั้นคุณควรโทรsetFinishOnTouchOutside(false)
จากกิจกรรมของคุณหากคุณต้องการให้มันเปิดเมื่อมีการคลิกกิจกรรมพื้นหลัง
แก้ไข: ใช้งานได้กับ android API ระดับ 11 ขึ้นไปเท่านั้น
onBackPressed()
การไม่ทำอะไรเลยในร่างกาย
สิ่งที่ใช้ได้ผลสำหรับฉันคือการสร้างDialogFragment
ชุดที่ไม่สามารถยกเลิกได้:
dialog.setCancelable(false);
เมื่อใช้กล่องโต้ตอบเป็นกิจกรรมใน onCreate ให้เพิ่มสิ่งนี้
setFinishOnTouchOutside(false);
สำหรับ API 10 ที่สูงขึ้นกล่องโต้ตอบจะหายไปเมื่อแตะที่นอกขณะที่ต่ำกว่า API 11 กล่องโต้ตอบจะไม่หายไป เพื่อป้องกันสิ่งนี้คุณต้องทำ:
ในstyles.xml
:<item name="android:windowCloseOnTouchOutside">false</item>
หรือ
ในonCreate()
วิธีการใช้:this.setFinishOnTouchOutside(false);
หมายเหตุ: สำหรับ API 10 และต่ำกว่าวิธีนี้ไม่มีผลและไม่จำเป็น
การตั้งค่าการยกเลิกกล่องโต้ตอบเป็นเท็จนั้นเพียงพอแล้วและคุณแตะที่นอกกรอบโต้ตอบการแจ้งเตือนหรือคลิกที่ปุ่มย้อนกลับจะทำให้กล่องโต้ตอบแจ้งเตือนหายไป ดังนั้นใช้อันนี้:
setCancelable(false)
และฟังก์ชั่นอื่น ๆ ไม่จำเป็นอีกต่อไป:
dialog.setCanceledOnTouchOutside(false);
หากคุณกำลังสร้างกล่องโต้ตอบชั่วคราวและสงสัยว่าจะใส่รหัสบรรทัดนี้ไว้นี่คือตัวอย่าง:
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();
ใช้รหัสนี้ใช้งานได้สำหรับฉัน
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.
ดูลิงค์นี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการโต้ตอบ
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
เพียงแค่
alertDialog.setCancelable(false);
ป้องกันไม่ให้ผู้ใช้คลิกนอกกล่องโต้ตอบ
กล่องโต้ตอบการแจ้งเตือนเลิกใช้แล้วดังนั้นให้ใช้กล่องโต้ตอบโต้ตอบ = กล่องโต้ตอบใหม่ (นี่);
เพื่อป้องกันการสัมผัสด้านนอกอย่างใกล้ชิด
dialog.setCanceledOnTouchOutside(false);
ใช้setFinishOnTouchOutside(false)
สำหรับ API> 11 และไม่ต้องกังวลเพราะพฤติกรรมเริ่มต้นของแอนดรอยด์ที่กล่องโต้ตอบชุดรูปแบบกิจกรรมจะไม่ได้รับการติดต่อจากภายนอกสำหรับ API <11 :) !! ไชโย !!
ฉันใช้สิ่งนี้ใน onCreate () ดูเหมือนว่าจะใช้งานได้กับ Android ทุกรุ่น ทดสอบบน 5.0 และ 4.4.x ไม่สามารถทดสอบ Gingerbread ได้อุปกรณ์ Samsung (หมายเหตุ 1 ใช้ GB) มีวิธีนี้เป็นค่าเริ่มต้น:
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);
ฉันเดาว่าสิ่งนี้จะช่วยคุณได้ผลสำหรับฉัน
นี่คือทางออกของฉัน:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
นอกจากนี้ยังเป็นไปได้ที่จะมอบหมายการดำเนินการที่แตกต่างกันในการใช้ onCancelListener:
alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
@Override
public void onCancel(DialogInterface dialogInterface) {
//Your custom logic
}
});
ฉันกำลังเผชิญกับปัญหาเดียวกัน เพื่อจัดการมันฉันตั้งค่าOntouchListener
ไปที่กล่องโต้ตอบและไม่ทำอะไรข้างใน แต่ไดอะล็อกจะยกเลิกเมื่อหมุนหน้าจอด้วย ในการแก้ไขมันฉันตั้งค่าตัวแปรเพื่อบอกฉันว่าไดอะล็อกถูกไล่ออกตามปกติ จากนั้นฉันจะตั้งค่าเป็นOnDismissListener
กล่องโต้ตอบและภายในฉันตรวจสอบตัวแปร หากไดอะล็อกมีการปฏิเสธโดยปกติฉันไม่ทำอะไรเลยมิฉะนั้นฉันจะเรียกใช้ไดอะล็อกอีกครั้ง (และตั้งค่าสถานะของเขาเมื่อเลิกใช้งานในกรณีของฉัน)
builder.setCancelable (false);
โมฆะสาธารณะ Mensaje (ดู 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();
}
นี่คือคำตอบที่สมบูรณ์แบบสำหรับทุกคำถามของคุณ .... หวังว่าคุณจะสนุกกับการเขียนโค้ดใน 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();