InputType là một thuộc tính Android xác định bản chất của dữ liệu nhập và hành vi bàn phím cho các trường văn bản. Giá trị InputType là một mặt nạ bit kết hợp lớp nhập liệu (văn bản, số, điện thoại, ngày tháng) và các bổ ngữ (nhiều dòng, tự động sửa, chữ hoa, nhập ẩn). InputType ảnh hưởng đến loại bàn phím hiển thị, lọc ký tự nhập và hành vi tự động điền. Theo Android Developers (2026), InputType là một trong những thuộc tính quan trọng nhất để đảm bảo nhập dữ liệu chính xác và phải được đặt rõ ràng cho mọi trường văn bản có thể chỉnh sửa.
Những điểm chính
InputType là một hằng số nguyên (Int) mã hóa chế độ nhập cho một trường văn bản. Trong Android, nó được định nghĩa trong lớp android.text.InputType. Giá trị InputType gồm hai phần: lớp nhập liệu (bit 0–4) và bổ ngữ (bit 5–31). Lớp nhập liệu xác định loại dữ liệu cơ bản — văn bản, số, điện thoại, ngày tháng. Bổ ngữ làm rõ hành vi trong lớp đã chọn — ví dụ, cho lớp văn bản, bạn có thể bật tự động sửa, chữ hoa hoặc nhập nhiều dòng.
Cơ chế InputType hoạt động ở ba cấp độ: ở cấp độ khung Android, nó xác định InputConnection nào sẽ được tạo (kết nối giữa EditText và IME); ở cấp độ IME (bàn phím), nó chỉ định ký tự nào hiển thị và cách xử lý nhập liệu; ở cấp độ ứng dụng, nó lọc ký tự qua InputFilter được tích hợp trong EditText. Theo Android Source Code (AOSP, 2026), mặt nạ bit được xử lý trong phương thức TextView.getInputType(), trả về giá trị hiện tại, và setInputType(), cấu hình lại bộ lọc nội bộ và kết nối IME.
Một đặc điểm quan trọng của InputType là nó không thể được đọc từ tiến trình khác vì lý do bảo mật. Điều này ngăn chặn hành vi trộm dữ liệu thông qua truy cập vào loại nhập liệu (ví dụ, xác định xem trường có phải mật khẩu không). Khi cố gắng đọc InputType từ ứng dụng khác, TYPE_CLASS_TEXT được trả về theo mặc định.
// Hằng số InputType cơ bản
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// Mặt nạ để trích xuất lớp
InputType.TYPE_MASK_CLASS // 0x0000000F
Android định nghĩa bốn lớp cơ bản InputType. Mỗi lớp tương ứng với một danh mục dữ liệu cụ thể và kích hoạt loại bàn phím tương ứng. Lớp được chỉ định trong bit 0–4 của mặt nạ bit và có thể được trích xuất qua mặt nạ TYPE_MASK_CLASS (0x0F).
| Lớp | Hằng số | Bàn phím | Sử dụng |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | Bàn phím QWERTY | Văn bản, bình luận, mô tả |
| NUMBER | TYPE_CLASS_NUMBER (2) | Số | Số lượng, giá cả, tuổi |
| PHONE | TYPE_CLASS_PHONE (3) | Điện thoại | Số điện thoại |
| DATETIME | TYPE_CLASS_DATETIME (4) | Ngày/giờ | Ngày, giờ |
TYPE_CLASS_DATETIME hiếm khi được sử dụng trực tiếp — nhập ngày thường dùng DatePicker hoặc DatePickerDialog thay vì trường văn bản. Tuy nhiên, trong một số tình huống (nhập ngày thủ công nhanh), lớp này có thể hữu ích. Nó không có bàn phím chuyên dụng và thường hiển thị bàn phím số.
Mỗi lớp nhập liệu có thể kết hợp với các biến thể — kiểu phụ được chỉ định trong bit 5–7. Ví dụ, TYPE_TEXT_VARIATION_PASSWORD (bit 5) thêm nhập ẩn vào lớp TEXT. Bit biến thể: 0x000000E0 (mặt nạ TYPE_MASK_VARIATION).
Cờ bổ ngữ của InputType (bit 8–31) thêm khả năng bổ sung cho lớp cơ sở. Chúng không thay đổi loại bàn phím nhưng sửa đổi hành vi nhập liệu. Cờ dành riêng cho từng lớp — cờ TEXT không hoạt động với NUMBER và ngược lại. Dưới đây là các bổ ngữ chính cho mỗi lớp.
Theo Android Developers Documentation (2026), cờ của các lớp khác nhau không trùng lặp — cố gắng sử dụng cờ TEXT với NUMBER sẽ bị bỏ qua. Để kiểm tra cờ đã đặt, sử dụng AND bit: (inputType and FLAG) != 0.
Sự kết hợp đúng đắn giữa các lớp và cờ InputType là chìa khóa để tạo biểu mẫu thân thiện với người dùng. Hãy xem xét các tình huống điển hình và cấu hình InputType tương ứng. Mỗi tình huống tối ưu hóa nhập liệu cho một loại dữ liệu cụ thể, làm cho biểu mẫu trực quan và tăng tốc độ điền.
| Tình huống | InputType | Bàn phím |
|---|---|---|
| Tên | textCapWords | QWERTY, mỗi từ viết hoa |
| textEmailAddress | QWERTY với @ và . | |
| Mật khẩu | textPassword | QWERTY, nhập ẩn |
| Điện thoại | phone | Số với +, #, * |
| Giá | numberDecimal | Số với dấu thập phân |
| Số lượng | number | Chỉ số |
| Bình luận | textCapSentences|textMultiLine | QWERTY, nhiều dòng |
| Tìm kiếm | text|textNoSuggestions | QWERTY không gợi ý |
// Kết hợp cho trường giá
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Kết hợp cho trường bình luận
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
Đặt InputType bằng lập trình qua setInputType() ghi đè giá trị trước đó. Nếu bạn chỉ cần thay đổi một phần của mặt nạ (ví dụ, thêm cờ), bạn phải lưu giá trị hiện tại, sửa đổi nó và áp dụng lại. Mỗi lần gọi setInputType() sẽ cấu hình lại bộ lọc nội bộ của EditText.
Phương thức setRawInputType() khác với setInputType ở chỗ nó không kích hoạt việc cấu hình lại bộ lọc và gợi ý. Nó được sử dụng để thay đổi InputType tạm thời mà không cần tải lại toàn bộ trạng thái EditText. Sau khi gọi setInputType(), nên khởi động lại IME để cập nhật bàn phím.
// Chuyển đổi giữa mật khẩu và văn bản hiển thị
fun togglePasswordVisibility(editText: EditText) {
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
editText.inputType = if (isPassword) {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// Giữ vị trí con trỏ
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// Lấy lớp nhập liệu
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// Lấy biến thể nhập liệu
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// Kiểm tra xem có phải trường mật khẩu
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
Chọn InputType đúng không chỉ là vấn đề UX mà còn là bảo mật và tính chính xác của dữ liệu. Các khuyến nghị chính bao gồm: luôn chỉ định InputType rõ ràng cho mỗi EditText; sử dụng lớp nhập liệu cụ thể nhất có thể; không kết hợp cờ từ các lớp khác nhau; sử dụng biến thể PASSWORD cho trường dữ liệu nhạy cảm; sử dụng imeOptions="actionSearch" cho trường tìm kiếm.
InputType cũng ảnh hưởng đến hoạt động của các dịch vụ hỗ trợ tiếp cận (Accessibility). Các trường loại textPassword nhận được bảo vệ bổ sung từ trình đọc màn hình — chúng không đọc to các ký tự đã nhập. Đối với trường textEmailAddress, trình đọc màn hình thông báo cho người dùng rằng trường dành cho email và cung cấp gợi ý thích hợp.
Theo Material Design Guidelines (2025), InputType phải phù hợp với loại dữ liệu mà người dùng đang nhập. InputType không chính xác không chỉ làm chậm nhập liệu mà còn có thể gây ra lỗi: ví dụ, nếu bạn để textMultiLine cho trường số điện thoại, bàn phím sẽ không hiển thị bàn phím số và người dùng sẽ phải chuyển đổi bố cục thủ công mỗi lần.
Các câu hỏi thường gặp
InputType là một thuộc tính EditText xác định loại dữ liệu nhập thông qua mặt nạ bit. Keyboard Type là tên không chính thức cho loại bàn phím trực quan được kích hoạt bởi InputType. InputType cũng ảnh hưởng đến lọc ký tự, tự động sửa và tự động hoàn thành — không chỉ bố cục bàn phím.
Đặt editText.inputType = InputType.TYPE_CLASS_TEXT hoặc sử dụng hằng số InputType.TYPE_NULL (0x00000000) để đặt lại hoàn toàn. Với TYPE_NULL, trường sẽ không hiển thị bàn phím khi được lấy tiêu điểm. Để quay lại nhập văn bản tiêu chuẩn, đặt TYPE_CLASS_TEXT không có cờ.
Bạn không thể tạo lớp InputType mới vì nó là một phần của khung Android. Tuy nhiên, bạn có thể kết hợp các lớp và cờ hiện có để đạt được hành vi mong muốn. Thực hiện lọc ký tự bổ sung thông qua InputFilter, được đặt trên EditText bằng phương thức setFilters().
InputType được truyền đến hệ thống nhập liệu qua InputConnection. IME đọc lớp và biến thể InputType và chọn bố cục bàn phím tương ứng. Ví dụ, TYPE_CLASS_NUMBER với TYPE_NUMBER_FLAG_DECIMAL làm cho bàn phím hiển thị bàn phím số có dấu thập phân. Hầu hết bàn phím hiện đại đều tuân theo các khuyến nghị này.
Sử dụng thuộc tính editText.inputType trong Kotlin hoặc editText.getInputType() trong Java. Để trích xuất lớp, áp dụng mặt nạ: inputType and InputType.TYPE_MASK_CLASS. Để kiểm tra cờ cụ thể: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — nếu kết quả != 0, cờ đã được đặt.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm