InputType — nó là gì, các thuộc tính nhập liệu và cấu hình trong Android

Tác giả: IT Sectr Đã đăng: 2026-07-07 Thời gian đọc: 9 phút

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 — một mặt nạ bit xác định lớp nhập liệu và bổ ngữ cho EditText.
  • Lớp nhập liệu — TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME.
  • Bổ ngữ — các cờ làm rõ hành vi: MULTI_LINE, AUTO_CORRECT, PASSWORD, CAP_SENTENCES.
  • Kết hợp — lớp và bổ ngữ được kết hợp qua OR bit để cấu hình chính xác.
  • Tác động — InputType đúng đắn tăng tốc nhập liệu, giảm lỗi và cải thiện UX biểu mẫu.

InputType trong Android là gì

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.

kotlin
// 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

Các lớp InputType: TEXT, NUMBER, PHONE, DATETIME

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ớpHằng sốBàn phímSử dụng
TEXTTYPE_CLASS_TEXT (1)Bàn phím QWERTYVăn bản, bình luận, mô tả
NUMBERTYPE_CLASS_NUMBER (2)SốSố lượng, giá cả, tuổi
PHONETYPE_CLASS_PHONE (3)Điện thoạiSố điện thoại
DATETIMETYPE_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ữ InputType

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.

Cờ cho TEXT

  • TYPE_TEXT_FLAG_CAP_CHARACTERS — tất cả chữ cái viết hoa.
  • TYPE_TEXT_FLAG_CAP_WORDS — mỗi từ bắt đầu bằng chữ hoa.
  • TYPE_TEXT_FLAG_CAP_SENTENCES — chữ hoa đầu câu (mặc định).
  • TYPE_TEXT_FLAG_AUTO_CORRECT — tự động sửa lỗi gõ.
  • TYPE_TEXT_FLAG_AUTO_COMPLETE — tự động hoàn thành (cho AutoCompleteTextView).
  • TYPE_TEXT_FLAG_MULTI_LINE — nhập nhiều dòng.
  • TYPE_TEXT_FLAG_NO_SUGGESTIONS — tắt gợi ý.

Cờ cho NUMBER

  • TYPE_NUMBER_FLAG_SIGNED — cho phép số âm (dấu trừ).
  • TYPE_NUMBER_FLAG_DECIMAL — cho phép dấu thập phân.

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.

Kết hợp InputType: ví dụ cho các tình huống khác nhau

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ốngInputTypeBàn phím
TêntextCapWordsQWERTY, mỗi từ viết hoa
EmailtextEmailAddressQWERTY với @ và .
Mật khẩutextPasswordQWERTY, nhập ẩn
Điện thoạiphoneSố với +, #, *
GiánumberDecimalSố với dấu thập phân
Số lượngnumberChỉ số
Bình luậntextCapSentences|textMultiLineQWERTY, nhiều dòng
Tìm kiếmtext|textNoSuggestionsQWERTY không gợi ý
kotlin
// 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

Làm việc với InputType bằng lập trình

Đặ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 chế độ

kotlin
// 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)
}

Trích xuất lớp và biến thể

kotlin
// 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
}

Thực hành tốt nhất khi chọn InputType

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.

  • Rõ ràng — luôn đặt InputType rõ ràng, không dựa vào giá trị mặc định (textMultiLine).
  • Cụ thể — sử dụng loại cụ thể nhất: textEmailAddress, không phải text, cho email.
  • Bảo mật — cho mật khẩu, mã PIN và dữ liệu thẻ, sử dụng biến thể PASSWORD.
  • Tự động điền — kết hợp InputType với autofillHints để hỗ trợ trình quản lý mật khẩu.
  • Kiểm tra — kiểm tra hành vi trên các bàn phím khác nhau (Gboard, SwiftKey, Samsung Keyboard).

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 khác với Keyboard Type như thế nào?

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.

Làm thế nào để đặt lại InputType về giá trị mặc định?

Đặ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ờ.

Tôi có thể tạo InputType tùy chỉnh không?

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 ảnh hưởng đến IME (bàn phím) như thế nào?

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.

Làm thế nào để kiểm tra InputType trong thời gian chạ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

  • InputType — một mặt nạ bit gồm một lớp nhập liệu (TEXT, NUMBER, PHONE, DATETIME) và các bổ ngữ.
  • Lớp nhập liệu xác định loại dữ liệu cơ bản và loại bàn phím hiển thị.
  • Bổ ngữ làm rõ hành vi: nhiều dòng, tự động sửa, chữ hoa, nhập ẩn.
  • Kết hợp qua OR bit cho phép tạo cấu hình chính xác cho các tình huống khác nhau.
  • Biến thể PASSWORD tắt tự động sửa, ẩn ký tự và ngăn lưu vào từ điển.
  • Đặt bằng lập trình qua setInputType() yêu cầu khởi động lại IME để cập nhật bàn phím.
  • Thực hành tốt nhất — đặt InputType rõ ràng, sử dụng loại cụ thể và kiểm tra trên các bàn phím khác nhau.

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.

Thảo luận dự án

Đọc thêm