Một form yêu cầu nhập tên nhưng vẫn chấp nhận ba dấu cách. Nếu điều kiện kiểm tra dùng TextUtils.isEmpty, hãy nhìn lại hợp đồng của hàm: chuỗi có độ dài lớn hơn 0 vẫn có thể không chứa nội dung mà sản phẩm muốn chấp nhận.
Bài này giúp bạn tách ba trường hợp: chưa có giá trị, chuỗi không có ký tự và chuỗi chỉ gồm whitespace. Từ đó, bạn có thể viết một điều kiện validation dễ đọc và một kế hoạch kiểm thử ngắn cho form Android.
Điều kiện và giới hạn
Đối chiếu Android API reference ngày 11/11/2026: TextUtils.isEmpty có từ API level 1. Tài liệu Kotlin hiện hiển thị nhánh 2.4; isBlank và isNullOrBlank có từ Kotlin 1.0. Bài không yêu cầu nâng toàn bộ dự án lên phiên bản đó chỉ để dùng các hàm này.
Ví dụ được rà theo tài liệu, chưa biên dịch Kotlin, chạy Android SDK, emulator hay thiết bị. Bảng hành vi dưới đây là kỳ vọng theo hợp đồng API, không phải log thực thi. Bạn nên chạy test trên cấu hình Kotlin và Android của dự án.
1. Chọn đúng câu hỏi cho tên nhập
TextUtils.isEmpty kiểm tra null hoặc độ dài bằng 0. Kotlin isBlank kiểm tra chuỗi rỗng hoặc toàn ký tự whitespace theo định nghĩa Char.isWhitespace; phiên bản isNullOrBlank xử lý thêm null.
Với dữ liệu kiểu nullable, ba fixture đầu nên là null, chuỗi rỗng và ba dấu cách. Sau đó thêm một tên có nội dung để xác nhận điều kiện không từ chối mọi đầu vào.
import android.text.TextUtils
fun inspectName(raw: String?): Pair<Boolean, Boolean> {
return TextUtils.isEmpty(raw) to raw.isNullOrBlank()
}
// Kỳ vọng theo API, cần chạy trong test của dự án:
// null -> true, true
// "" -> true, true
// " " -> false, true
// "An" -> false, false
Hai boolean trả lời hai câu hỏi khác nhau. Đừng thay hàm ở toàn bộ codebase chỉ vì một form có lỗi: một trường tùy chọn có thể cho phép khoảng trắng theo hợp đồng riêng, hoặc bước khác đã chuẩn hóa dữ liệu.
2. Kiểm tra blank và chuẩn hóa là hai quyết định
Giả sử tên hiển thị cần có nội dung và không giữ khoảng trắng hai đầu. Bạn có thể viết hàm nhỏ trước khi nối với View:
fun normalizeDisplayName(raw: String?): String? {
if (raw.isNullOrBlank()) return null
return raw.trim()
}
Hàm trả null để biểu diễn đầu vào không hợp lệ trong ví dụ; nó không gửi dữ liệu hay tự hiển thị thông báo. Với " An Nguyen ", kỳ vọng là "An Nguyen", còn khoảng trắng giữa hai phần tên vẫn được giữ. Đừng dùng cách xóa mọi dấu cách để giải quyết lỗi chuỗi blank.
Trước khi áp dụng cho mật khẩu, mã định danh hoặc văn bản nhiều dòng, hãy đọc lại hợp đồng sản phẩm. Quy tắc của tên hiển thị trong ví dụ không tự phù hợp cho mọi trường nhập. Một bước trim không có trong đặc tả có thể làm thay đổi dữ liệu người dùng muốn giữ.
3. Nối vào form Android
Trong listener của nút Lưu, lấy chuỗi từ EditText rồi truyền vào hàm chuẩn hóa. Đoạn tích hợp sau giả định nameInput là EditText đang tồn tại trong màn hình, không phải một Activity hoàn chỉnh.
val candidate = normalizeDisplayName(nameInput.text?.toString())
if (candidate == null) {
nameInput.error = "Hãy nhập tên có nội dung"
} else {
nameInput.error = null
// Chuyển candidate cho bước xử lý tiếp theo của ứng dụng.
}
Không dùng TextUtils để suy ra chuỗi đã hợp lệ theo mọi quy tắc nghiệp vụ. Kiểm tra có nội dung chỉ là một bước. Độ dài, ký tự được phép và tính duy nhất cần có điều kiện riêng nếu sản phẩm yêu cầu.
Kế hoạch kiểm thử
Tạo test cho null, rỗng, dấu cách, tab, xuống dòng, tên bình thường và tên có khoảng trắng hai đầu. Với từng case, ghi rõ đầu vào, kết quả chuẩn hóa mong đợi và thông báo UI tương ứng. Một test chỉ có chuỗi rỗng sẽ bỏ sót chính lỗi ban đầu.
Nếu ứng dụng cần phân biệt các loại khoảng trắng Unicode hoặc ký tự không nhìn thấy, bổ sung fixture theo hợp đồng cụ thể. Bài này không khẳng định mọi ký tự “trông như trống” đều được Kotlin coi là whitespace. Đọc định nghĩa ký tự và kiểm tra phiên bản runtime đích trước khi mở rộng chính sách.
Lỗi thường gặp và kết luận
Đừng gọi kiểm tra blank rồi gửi nguyên một chuỗi chưa chuẩn hóa trong khi giao diện hiển thị chuỗi đã trim. Hãy xác định rõ giá trị nào sẽ được gửi và kiểm thử giá trị đó. Validation phía client cũng không thay thế kiểm tra ở backend.
Với tên hiển thị cần nội dung, isNullOrBlank diễn đạt yêu cầu rõ hơn phép kiểm tra độ dài. Giữ chính sách chuẩn hóa riêng, có fixture và thông báo dễ hiểu cho người dùng.

