Giới thiệu
Mặc định, AlertDialog trong Android cho phép tắt khi chạm ra ngoài (outside touch). Ví dụ này minh họa cách kiểm soát hành vi này thông qua phương thức setCanceledOnTouchOutside().
Các bước thực hiện
Bước 1: Tạo dự án mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mở Dialog"
android:textSize="30sp" />
</LinearLayout>
Bước 3: Logic chính (src/MainActivity.java)
package com.example.myapplication;
import android.annotation.TargetApi;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView text;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.click);
text.setOnClickListener(v -> showAlertDialog());
}
private void showAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Thông báo");
builder.setMessage("Bạn có muốn đóng dialog này không?");
builder.setIcon(R.mipmap.ic_launcher); // Dùng icon mặc định
builder.setPositiveButton("Có", (dialog, which) ->
Toast.makeText(this, "Đã bấm Có", Toast.LENGTH_SHORT).show());
builder.setNegativeButton("Không", (dialog, which) -> {
// Không làm gì, dialog tự đóng
});
AlertDialog dialog = builder.create();
// QUAN TRỌNG: false = KHÔNG tắt khi click ra ngoài, true = CÓ tắt
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
}
Giải thích quan trọng
| Phương thức | Giá trị | Hành vi |
|---|---|---|
setCanceledOnTouchOutside(true) | true (mặc định) | Click ra ngoài → Dialog tắt |
setCanceledOnTouchOutside(false) | false | Click ra ngoài → Dialog KHÔNG tắt, buộc phải bấm nút |
Ví dụ gốc đặt false để bắt buộc người dùng phải chọn Có/Không.
Bước 4: Chạy ứng dụng
Nhấn Run. Màn hình hiển thị TextView "Mở Dialog". Nhấn vào → hiện AlertDialog. Thử click ra ngoài vùng dialog → dialog không tắt (vì setCanceledOnTouchOutside(false)). Phải bấm "Có" hoặc "Không" mới đóng.


Mẹo bổ sung
- Để không cho tắt bằng nút Back:
dialog.setCancelable(false). - Tùy chỉnh layout dialog:
builder.setView(R.layout.custom_dialog).