ตัวอย่างนี้สาธิตวิธี ป้องกันไม่ให้ AlertDialog ปิดอัตโนมัติ เมื่อกดปุ่ม Positive/Negative โดยการ Override OnClickListener หลังจาก show()
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → New Project → Empty Activity
ขั้นตอนที่ 2: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Prevent Dialog Dismiss"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
ขั้นตอนที่ 3: โค้ดหลัก (MainActivity.kt)
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Dialog No Dismiss Demo"
// สร้างและแสดง Dialog
val dialog = AlertDialog.Builder(this)
.setTitle("My Alert Dialog")
.setMessage("Do you want to dismiss this Dialog?")
.setPositiveButton("OK", null) // null = ไม่ทำอะไร ปิดอัตโนมัติ
.setNegativeButton("Cancel", null)
.show()
// 🔑 จุดสำคัญ: Override Listener หลัง show() เพื่อควบคุมการปิด
val positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
positiveButton.setOnClickListener {
// ตรวจสอบเงื่อนไขก่อนปิด
Toast.makeText(this, "Validation: Do not dismiss yet", Toast.LENGTH_SHORT).show()
// ตัวอย่าง: ตรวจสอบ Input ก่อนปิด
// if (isValidInput()) {
// dialog.dismiss() // ปิดเองเมื่อผ่าน
// }
}
val negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
negativeButton.setOnClickListener {
dialog.dismiss() // ปิดปกติ
}
}
}
🔧 วิธีอื่น: ใช้ setOnShowListener (แนะนำกว่า)
val dialog = AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Message")
.setPositiveButton("OK", null)
.setNegativeButton("Cancel", null)
.create()
dialog.setOnShowListener {
val positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
positiveBtn.setOnClickListener {
// Logic ตรวจสอบ
if (validate()) dialog.dismiss()
}
}
dialog.show()
ขั้นตอนที่ 4: AndroidManifest.xml
Manifest มาตรฐาน
💡 เมื่อไหร่ควรใช้?
- ต้องการ Validate Input ก่อนปิด Dialog
- ต้องการ Confirm Action ก่อนดำเนินการ
- ต้องการ แสดง Error ใน Dialog เดียวโดยไม่ปิด
⚠️ ข้อควรระวัง
- ต้อง Override Listener หลัง
show()หรือในsetOnShowListenerเท่านั้น - หากตั้ง Listener ใน Builder (.setPositiveButton) จะ Override ไม่ได้
- 記得 เรียก
dialog.dismiss()เองเมื่อเงื่อนไขผ่าน
ทดสอบ
- รันแอป → Dialog แสดงขึ้น
- กด "OK" → จะแสดง Toast "Do not dismiss yet" และ Dialog **ไม่ปิด**
- กด "Cancel" → Dialog ปิดปกติ