InputType คือแอตทริบิวต์ของ Android ที่กำหนดลักษณะของข้อมูลที่ป้อนและพฤติกรรมของแป้นพิมพ์สำหรับฟิลด์ข้อความ ค่า InputType เป็นบิตมาสก์ที่รวมคลาสอินพุต (ข้อความ ตัวเลข โทรศัพท์ วันที่) และตัวปรับแต่ง (หลายบรรทัด แก้ไขอัตโนมัติ ตัวพิมพ์ใหญ่ อินพุตที่ซ่อนอยู่) InputType ส่งผลต่อประเภทของแป้นพิมพ์ที่แสดง การกรองอักขระอินพุต และพฤติกรรมการป้อนอัตโนมัติ ตาม Android Developers (2026) InputType เป็นหนึ่งในแอตทริบิวต์ที่สำคัญที่สุดสำหรับการรับประกันการป้อนข้อมูลที่ถูกต้อง และควรตั้งค่าอย่างชัดเจนสำหรับทุกฟิลด์ข้อความที่แก้ไขได้
ประเด็นสำคัญ
InputType คือค่าคงที่จำนวนเต็ม (Int) ที่เข้ารหัสโหมดอินพุตสำหรับฟิลด์ข้อความ ใน Android มีการกำหนดไว้ในคลาส android.text.InputType ค่า InputType ประกอบด้วยสองส่วน: คลาสอินพุต (บิต 0–4) และตัวปรับแต่ง (บิต 5–31) คลาสอินพุตกำหนดประเภทข้อมูลพื้นฐาน — ข้อความ ตัวเลข โทรศัพท์ วันที่ ตัวปรับแต่งระบุพฤติกรรมภายในคลาสที่เลือก — ตัวอย่างเช่น สำหรับคลาสข้อความ คุณสามารถเปิดใช้งานการแก้ไขอัตโนมัติ ตัวพิมพ์ใหญ่ หรืออินพุตหลายบรรทัด
กลไก InputType ทำงานในสามระดับ: ที่ระดับเฟรมเวิร์กของ Android จะกำหนดว่าจะสร้าง InputConnection ใด (การเชื่อมต่อระหว่าง EditText และ IME) ที่ระดับ IME (แป้นพิมพ์) จะระบุว่าจะแสดงอักขระใดและวิธีจัดการกับอินพุต ที่ระดับแอปพลิเคชัน จะกรองอักขระผ่าน InputFilter ที่สร้างใน EditText ตาม Android Source Code (AOSP, 2026) บิตมาสก์จะถูกจัดการในเมธอด TextView.getInputType() ซึ่งส่งคืนค่าปัจจุบัน และ setInputType() ซึ่งกำหนดค่าตัวกรองภายในและการเชื่อมต่อ IME ใหม่
คุณสมบัติที่สำคัญของ InputType คือไม่สามารถอ่านจากกระบวนการอื่นได้ด้วยเหตุผลด้านความปลอดภัย ซึ่งป้องกันการขโมยข้อมูลผ่านการเข้าถึงประเภทอินพุต (ตัวอย่างเช่น การระบุว่าฟิลด์เป็นรหัสผ่านหรือไม่) เมื่อพยายามอ่าน InputType จากแอปพลิเคชันอื่น TYPE_CLASS_TEXT จะถูกส่งคืนตามค่าเริ่มต้น
// ค่าคงที่ InputType พื้นฐาน
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// มาสก์สำหรับแยกคลาส
InputType.TYPE_MASK_CLASS // 0x0000000F
Android กำหนดคลาส InputType พื้นฐานสี่คลาส แต่ละคลาสสอดคล้องกับหมวดหมู่ข้อมูลเฉพาะและเปิดใช้งานประเภทแป้นพิมพ์ที่เกี่ยวข้อง คลาสถูกระบุในบิต 0–4 ของบิตมาสก์และสามารถแยกได้ผ่านมาสก์ TYPE_MASK_CLASS (0x0F)
| คลาส | ค่าคงที่ | แป้นพิมพ์ | การใช้งาน |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | แป้นพิมพ์ QWERTY | ข้อความ ความคิดเห็น คำอธิบาย |
| NUMBER | TYPE_CLASS_NUMBER (2) | ตัวเลข | ปริมาณ ราคา อายุ |
| PHONE | TYPE_CLASS_PHONE (3) | โทรศัพท์ | หมายเลขโทรศัพท์ |
| DATETIME | TYPE_CLASS_DATETIME (4) | วันที่/เวลา | วันที่ เวลา |
TYPE_CLASS_DATETIME ไม่ค่อยได้ใช้โดยตรง — โดยปกติการป้อนวันที่จะใช้ DatePicker หรือ DatePickerDialog แทนฟิลด์ข้อความ อย่างไรก็ตาม ในบางสถานการณ์ (การป้อนวันที่ด้วยตนเองอย่างรวดเร็ว) คลาสนี้มีประโยชน์ได้ ไม่มีแป้นพิมพ์เฉพาะและมักจะแสดงแป้นพิมพ์ตัวเลข
แต่ละคลาสอินพุตสามารถรวมกับรูปแบบต่างๆ — ชนิดย่อยที่ระบุในบิต 5–7 ตัวอย่างเช่น TYPE_TEXT_VARIATION_PASSWORD (บิต 5) เพิ่มอินพุตที่ซ่อนอยู่ให้กับคลาส TEXT บิตรูปแบบ: 0x000000E0 (มาสก์ TYPE_MASK_VARIATION)
แฟล็กตัวปรับแต่ง ของ InputType (บิต 8–31) เพิ่มความสามารถเพิ่มเติมให้กับคลาสพื้นฐาน ไม่เปลี่ยนประเภทแป้นพิมพ์ แต่ปรับเปลี่ยนพฤติกรรมอินพุต แฟล็กเฉพาะสำหรับแต่ละคลาส — แฟล็ก TEXT ไม่ทำงานกับ NUMBER และในทางกลับกัน ด้านล่างนี้คือตัวปรับแต่งหลักสำหรับแต่ละคลาส
ตาม Android Developers Documentation (2026) แฟล็กของคลาสต่างๆ ไม่ซ้อนทับกัน — การพยายามใช้แฟล็ก TEXT กับ NUMBER จะถูกละเว้น หากต้องการตรวจสอบแฟล็กที่ตั้งไว้ ให้ใช้ AND ระดับบิต: (inputType and FLAG) != 0
การรวมที่ถูกต้องของคลาสและแฟล็ก InputType เป็นกุญแจสำคัญในการสร้างฟอร์มที่ใช้งานง่าย มาดูสถานการณ์ทั่วไปและการกำหนดค่า InputType ที่เกี่ยวข้องกัน แต่ละสถานการณ์ปรับแต่งอินพุตสำหรับประเภทข้อมูลเฉพาะ ทำให้ฟอร์มใช้งานง่ายและเร่งการกรอกข้อมูล
| สถานการณ์ | InputType | แป้นพิมพ์ |
|---|---|---|
| ชื่อ | textCapWords | QWERTY แต่ละคำขึ้นต้นด้วยตัวพิมพ์ใหญ่ |
| อีเมล | textEmailAddress | QWERTY พร้อม @ และ . |
| รหัสผ่าน | textPassword | QWERTY อินพุตที่ซ่อนอยู่ |
| โทรศัพท์ | phone | ตัวเลขพร้อม +, #, * |
| ราคา | numberDecimal | ตัวเลขพร้อมจุดทศนิยม |
| ปริมาณ | number | เฉพาะตัวเลข |
| ความคิดเห็น | textCapSentences|textMultiLine | QWERTY หลายบรรทัด |
| ค้นหา | text|textNoSuggestions | QWERTY ไม่มีคำแนะนำ |
// การรวมสำหรับฟิลด์ราคา
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// การรวมสำหรับฟิลด์ความคิดเห็น
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
การตั้งค่า InputType ด้วยโปรแกรมผ่าน setInputType() จะเขียนทับค่าก่อนหน้า หากคุณต้องการเปลี่ยนเพียงบางส่วนของมาสก์ (ตัวอย่างเช่น เพิ่มแฟล็ก) คุณต้องบันทึกค่าปัจจุบัน แก้ไข และนำกลับไปใช้ใหม่ ทุกครั้งที่เรียก setInputType() จะกำหนดค่าตัวกรองภายในของ EditText ใหม่
เมธอด setRawInputType() แตกต่างจาก setInputType ตรงที่ไม่ทำให้เกิดการกำหนดค่าตัวกรองและคำแนะนำใหม่ ใช้สำหรับเปลี่ยน InputType ชั่วคราวโดยไม่ต้องโหลดสถานะ EditText ทั้งหมดใหม่ หลังจากเรียก setInputType() แล้ว แนะนำให้รีสตาร์ท IME เพื่ออัปเดตแป้นพิมพ์
// สลับระหว่างรหัสผ่านและข้อความที่มองเห็น
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
}
// รักษาตำแหน่งเคอร์เซอร์
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// รับคลาสอินพุต
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// รับรูปแบบอินพุต
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// ตรวจสอบว่าเป็นฟิลด์รหัสผ่าน
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
การเลือก InputType ที่ถูกต้องไม่เพียงเกี่ยวกับ UX แต่ยังเกี่ยวกับความปลอดภัยและความถูกต้องของข้อมูลด้วย คำแนะนำหลักรวมถึง: ระบุ InputType อย่างชัดเจนสำหรับทุก EditText; ใช้คลาสอินพุตที่จำเพาะที่สุดเท่าที่เป็นไปได้; อย่ารวมแฟล็กจากคลาสต่างๆ; ใช้รูปแบบ PASSWORD สำหรับฟิลด์ข้อมูลที่ละเอียดอ่อน; ใช้ imeOptions="actionSearch" สำหรับฟิลด์ค้นหา
InputType ยังส่งผลต่อการทำงานของบริการช่วยเหลือการเข้าถึง (Accessibility) ฟิลด์ประเภท textPassword ได้รับการป้องกันเพิ่มเติมจากโปรแกรมอ่านหน้าจอ — จะไม่อ่านอักขระที่ป้อนออกเสียง สำหรับฟิลด์ textEmailAddress โปรแกรมอ่านหน้าจอจะแจ้งให้ผู้ใช้ทราบว่าฟิลด์นั้นมีไว้สำหรับอีเมลและให้คำแนะนำที่เหมาะสม
ตาม Material Design Guidelines (2025) InputType ควรตรงกับประเภทข้อมูลที่ผู้ใช้กำลังป้อน InputType ที่ไม่ถูกต้องไม่เพียงทำให้การป้อนข้อมูลช้าลง แต่ยังอาจทำให้เกิดข้อผิดพลาด: ตัวอย่างเช่น หากคุณปล่อย textMultiLine ไว้สำหรับฟิลด์หมายเลขโทรศัพท์ แป้นพิมพ์จะไม่แสดงแป้นพิมพ์ตัวเลข และผู้ใช้จะต้องเปลี่ยนเค้าโครงด้วยตนเองทุกครั้ง
คำถามที่พบบ่อย
InputType คือแอตทริบิวต์ของ EditText ที่กำหนดประเภทของข้อมูลอินพุตผ่านบิตมาสก์ Keyboard Type คือชื่อที่ไม่เป็นทางการสำหรับประเภทแป้นพิมพ์ที่มองเห็นซึ่งเปิดใช้งานโดย InputType InputType ยังส่งผลต่อการกรองอักขระ การแก้ไขอัตโนมัติ และการเติมข้อความอัตโนมัติ — ไม่ใช่เพียงเค้าโครงแป้นพิมพ์เท่านั้น
ตั้งค่า editText.inputType = InputType.TYPE_CLASS_TEXT หรือใช้ค่าคงที่ InputType.TYPE_NULL (0x00000000) สำหรับการรีเซ็ตทั้งหมด ด้วย TYPE_NULL ฟิลด์จะไม่แสดงแป้นพิมพ์เมื่อโฟกัส หากต้องการกลับไปยังอินพุตข้อความมาตรฐาน ให้ตั้งค่า TYPE_CLASS_TEXT โดยไม่มีแฟล็ก
คุณไม่สามารถสร้างคลาส InputType ใหม่ได้ เนื่องจากเป็นส่วนหนึ่งของเฟรมเวิร์ก Android อย่างไรก็ตาม คุณสามารถรวมคลาสและแฟล็กที่มีอยู่เพื่อให้ได้พฤติกรรมที่ต้องการ ดำเนินการกรองอักขระเพิ่มเติมผ่าน InputFilter ซึ่งตั้งค่าบน EditText โดยใช้เมธอด setFilters()
InputType จะถูกส่งไปยังระบบอินพุตผ่าน InputConnection IME จะอ่านคลาสและรูปแบบ InputType และเลือกเค้าโครงแป้นพิมพ์ที่เกี่ยวข้อง ตัวอย่างเช่น TYPE_CLASS_NUMBER กับ TYPE_NUMBER_FLAG_DECIMAL ทำให้แป้นพิมพ์แสดงแป้นพิมพ์ตัวเลขที่มีจุดทศนิยม แป้นพิมพ์ที่ทันสมัยส่วนใหญ่ปฏิบัติตามคำแนะนำเหล่านี้
ใช้คุณสมบัติ editText.inputType ใน Kotlin หรือ editText.getInputType() ใน Java หากต้องการแยกคลาส ให้ใช้มาสก์: inputType and InputType.TYPE_MASK_CLASS หากต้องการตรวจสอบแฟล็กเฉพาะ: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — หากผลลัพธ์ != 0 แสดงว่าแฟล็กถูกตั้งค่า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม