Keyboard Type là cấu hình bàn phím ảo trong Android xác định tập hợp các ký tự hiển thị và bố cục cho một trường nhập cụ thể. Android hỗ trợ nhiều loại được cài đặt sẵn: text (văn bản tiêu chuẩn), number (số), phone (điện thoại), email (với ký hiệu @), textPassword (cho mật khẩu), datetime và các loại khác. Mỗi loại tối ưu giao diện nhập cho một nhiệm vụ cụ thể — ví dụ, bàn phím email hiển thị ký hiệu @ và dấu chấm trên màn hình chính. Theo Android Developers (2026), việc chọn đúng Keyboard Type giảm số lần gõ phím từ 20–40% so với bàn phím văn bản tiêu chuẩn.
Các Điểm Chính
Keyboard Type được xác định bởi giá trị thuộc tính android:inputType trong XML hoặc bằng cách gọi setInputType() theo chương trình trong mã. InputType là mặt nạ bit nơi lớp nhập được kết hợp với các cờ sửa đổi. Các lớp cơ bản là: TYPE_CLASS_TEXT cho văn bản, TYPE_CLASS_NUMBER cho số, TYPE_CLASS_PHONE cho điện thoại, TYPE_CLASS_DATETIME cho ngày và giờ.
Mỗi Keyboard Type ảnh hưởng đến ba khía cạnh: bố cục bàn phím ảo (ký tự nào hiển thị trên màn hình chính), lọc các ký tự được nhập (ký tự nào được phép) và hành vi tự động sửa/tự động hoàn thành. Ví dụ, bàn phím số chỉ hiển thị chữ số và dấu phân cách thập phân, và nó không hiển thị chữ cái ngay cả khi người dùng chuyển đổi chữ hoa/chữ thường. Theo Android Developers Documentation (2026), việc kết hợp các lớp với các cờ cho phép tạo các chế độ chuyên biệt cao: văn bản nhiều dòng với tự động sửa, số dấu phẩy động, mật khẩu với hỗ trợ tự động điền.
Điều quan trọng là hiểu rằng Keyboard Type là một đề xuất cho hệ thống nhập (IME). Một số bàn phím của bên thứ ba (Gboard, SwiftKey) có thể bỏ qua một phần loại được chỉ định nếu người dùng đã đặt tùy chọn riêng của họ. Tuy nhiên, hầu hết các bàn phím Android tiêu chuẩn và Google Gboard tuân thủ nghiêm ngặt loại nhập được chỉ định.
// Thiết lập loại bàn phím theo chương trình
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
TYPE_CLASS_TEXT là lớp cơ bản cho nhập văn bản. Nó kích hoạt bàn phím QWERTY tiêu chuẩn với chữ cái, chữ số và ký hiệu. Lớp văn bản có nhiều bộ sửa đổi nhất giúp tinh chỉnh hành vi: TYPE_TEXT_FLAG_CAP_SENTENCES (chữ hoa tự động ở đầu câu), TYPE_TEXT_FLAG_AUTO_CORRECT (tự động sửa), TYPE_TEXT_FLAG_MULTI_LINE (chế độ nhiều dòng), TYPE_TEXT_FLAG_NO_SUGGESTIONS (tắt gợi ý).
Các bộ sửa đổi của bàn phím văn bản có thể được kết hợp để tạo các cấu hình chính xác: ví dụ, text|textCapSentences|textAutoCorrect phù hợp cho trường nhập bình luận nơi cần chữ hoa tự động và sửa lỗi chính tả. Trong khi đó, text|textNoSuggestions được sử dụng để nhập mã hoặc thuật ngữ đặc biệt nơi tự động sửa có thể gây hại.
Theo UX Stack Exchange (2025), bàn phím văn bản với tự động sửa được bật giúp tăng tốc gõ phím 15–25% cho người dùng trung bình, nhưng đối với các thuật ngữ kỹ thuật (mã, URL, email), nên tắt tự động sửa vì nó thường thay thế các thuật ngữ chính xác bằng các thuật ngữ không chính xác.
<!-- Text with autocorrect and capital sentences -->
android:inputType="textCapSentences|textAutoCorrect"
<!-- Text without suggestions and autocorrect -->
android:inputType="textNoSuggestions"
TYPE_CLASS_NUMBER kích hoạt bàn phím số, chỉ hiển thị chữ số, dấu phân cách thập phân và dấu trừ. Loại này được sử dụng cho các trường nhập số lượng, giá cả, tuổi, mã và dữ liệu số khác. Bàn phím số chiếm ít không gian màn hình hơn bàn phím văn bản và loại bỏ việc nhập chữ cái vô tình.
Number có ba bộ sửa đổi: TYPE_NUMBER_FLAG_DECIMAL thêm dấu chấm/phẩy thập phân, TYPE_NUMBER_FLAG_SIGNED thêm dấu trừ cho số âm, TYPE_NUMBER_VARIATION_PASSWORD — cho mã PIN nơi chữ số được hiển thị dưới dạng ký tự ẩn. Sự kết hợp number|numberDecimal|numberSigned tạo một trường đầy đủ để nhập số dấu phẩy động của bất kỳ dấu nào.
// Nhập số với dấu thập phân
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// Kiểm tra số đã nhập
val amount = editText.text.toString().toDoubleOrNull() ?: 0.0
TYPE_CLASS_PHONE kích hoạt bàn phím điện thoại, hiển thị chữ số và các ký tự điển hình cho số điện thoại: +, #, *, (, ). Không giống bàn phím số, phone cũng hiển thị bố cục chữ trong chế độ bổ sung, vì số điện thoại có thể chứa chữ cái (ví dụ, 1-800-FLOWERS). Lớp phone không có cờ bổ sung nhưng hỗ trợ TYPE_TEXT_VARIATION_PHONE_ETC để nhập số máy lẻ.
TYPE_TEXT_VARIATION_EMAIL_ADDRESS kích hoạt bàn phím email, nơi ký hiệu @ và dấu chấm ở trên màn hình chính, và các phần mở rộng tên miền phổ biến (.com, .net, .org) cũng có sẵn. Gboard hiển thị thêm các nút với tên miền phổ biến khi nhập sau @. Bàn phím email tự động tắt tự động sửa vì địa chỉ email có thể chứa các tổ hợp ký tự không tiêu chuẩn.
Theo Google Material Design Guidelines (2025), cho trường điện thoại, nên chỉ định thêm thuộc tính android:digits, giới hạn tập hợp các ký tự được phép. Cho trường email, cũng quan trọng là chỉ định autofillHints="email" để hỗ trợ tự động điền từ trình quản lý mật khẩu và Google Autofill.
<!-- Email keyboard with autofill -->
android:inputType="textEmailAddress"
android:importantForAutofill="yes"
android:autofillHints="emailAddress"
<!-- Phone keyboard with digit restriction -->
android:inputType="phone"
android:digits="0123456789+"
TYPE_TEXT_VARIATION_PASSWORD và TYPE_NUMBER_VARIATION_PASSWORD là các chế độ nhập cho dữ liệu nhạy cảm. Khi textPassword được đặt, các ký tự được nhập sẽ hiển thị dưới dạng dấu chấm hoặc dấu hoa thị (tùy thuộc vào phiên bản Android và bàn phím). Bàn phím trong chế độ này tắt tự động sửa và lưu các từ đã nhập vào từ điển người dùng, ngăn chặn rò rỉ mật khẩu qua các tính năng nhập dự đoán.
Bàn phím Password cũng tắt khả năng chụp ảnh màn hình nội dung trường (cờ FLAG_SECURE), mặc dù hành vi này phụ thuộc vào triển khai cụ thể của bàn phím. Bắt đầu từ Android 8.0 (API 26), bàn phím mật khẩu hỗ trợ tự động điền qua trình quản lý mật khẩu nếu thuộc tính importantForAutofill="yes" được đặt.
Theo Android Security Recommendations (2025), cho trường mật khẩu, cũng nên: đặt maxLength để ngăn mật khẩu quá dài (có thể là vector tấn công cơ sở dữ liệu), sử dụng inputType="textPassword" cùng với TextInputLayout và endIconMode="password_toggle" để người dùng có thể kiểm tra mật khẩu đã nhập trước khi gửi biểu mẫu.
<!-- Password field with show/hide icon -->
@+id/tilPasswordField
app:endIconMode="password_toggle">
@+id/etPasswordField
android:inputType="textPassword"
android:maxLength="64"
android:importantForAutofill="yes" />
</com.google.android.material.textfield.TextInputLayout>
Việc thiết lập theo chương trình Keyboard Type cho phép thay đổi chế độ bàn phím một cách động tùy theo ngữ cảnh hoặc đầu vào của người dùng. Ví dụ, khi chuyển đổi loại trường (văn bản/số/ngày) hoặc khi thay đổi ngôn ngữ. Phương thức setInputType() chấp nhận mặt nạ bit InputType và cập nhật ngay lập tức bàn phím nếu trường đang được focus.
// Chuyển đổi giữa nhập văn bản và số
fun switchInputType(field: EditText, isNumeric: Boolean) {
field.inputType = if (isNumeric) {
InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
}
field.setSelection(field.text.length)
}
// Kiểm tra xem trường có phải là số không
fun isNumericInput(field: EditText): Boolean {
val type = field.inputType
return (type and InputType.TYPE_MASK_CLASS) ==
InputType.TYPE_CLASS_NUMBER
}
// Kiểm tra xem tự động sửa có được bật không
fun isAutoCorrectEnabled(field: EditText): Boolean {
return (field.inputType and
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0
}
Câu hỏi thường gặp
Nếu inputType không được chỉ định, EditText mặc định sử dụng TYPE_CLASS_TEXT với cờ TYPE_TEXT_FLAG_MULTI_LINE. Điều này có nghĩa là bàn phím QWERTY tiêu chuẩn và nhập nhiều dòng. Đối với hầu hết các trường, nên chỉ định inputType rõ ràng để đảm bảo hành vi bàn phím chính xác và lọc ký tự.
Sử dụng thuộc tính android:imeOptions="actionDone" trên EditText. Điều này sẽ thay thế nút Enter bằng nút Xong. Các tùy chọn khác: actionSearch (kính lúp), actionNext (mũi tên phải), actionSend (gửi). Xử lý nhấn thông qua OnEditorActionListener trong mã.
Không thể tắt rung cho một trường cụ thể — đây là cài đặt hệ thống do người dùng kiểm soát trong cài đặt bàn phím. Tuy nhiên, bạn có thể ngăn bàn phím xuất hiện hoàn toàn bằng cách đặt thuộc tính android:focusable="false" trên EditText hoặc ghi đè hiển thị qua dispatchTouchEvent.
Đặt android:inputType="none" hoặc gọi theo chương trình editText.setKeyListener(null). Trường sẽ hiển thị văn bản, nhưng bàn phím sẽ không xuất hiện khi focus. Người dùng có thể chọn và sao chép văn bản, nhưng không thể chỉnh sửa nó. Một giải pháp thay thế là sử dụng TextView với textIsSelectable="true".
Sau khi gọi setInputType(), bạn cần hiển thị lại bàn phím, vì hệ thống có thể không tự động cập nhật IME. Gọi InputMethodManager.restartInput(view) để buộc cập nhật. Nếu trường không được focus, trước tiên hãy gọi requestFocus(), sau đó restartInput.
Tóm tắ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