Keyboard Type คือการกำหนดค่าแป้นพิมพ์เสมือนจริงใน Android ที่กำหนดชุดของอักขระที่แสดงและรูปแบบสำหรับช่องป้อนข้อมูลเฉพาะเจาะจง Android รองรับหลายชนิดที่ตั้งค่าไว้ล่วงหน้า: text (ข้อความมาตรฐาน), number (ตัวเลข), phone (โทรศัพท์), email (ด้วยสัญลักษณ์ @), textPassword (สำหรับรหัสผ่าน), datetime และอื่น ๆ แต่ละชนิดจะเพิ่มประสิทธิภาพอินเทอร์เฟาส์การป้อนสำหรับงานเฉพาะเจาะจง — ตัวอย่างเช่น แป้นพิมพ์อีเมลแสดงสัญลักษณ์ @ และจุดบนหน้าจอหลัก ตามข้อมูลจาก Android Developers (2026) การเลือก Keyboard Type ที่ถูกต้องช่วยลดจำนวนการกดแป้นพิมพ์ได้ 20–40% เมื่อเทียบกับแป้นพิมพ์ข้อความมาตรฐาน
ข้อควรจำ
Keyboard Type ถูกกำหนดโดยค่าของแอตทริบัวต์ android:inputType ใน XML หรือการเรียก setInputType() แบบโปรแกรมในโค้ด InputType เป็นบิตมาส์ที่คลาสการป้อนถูกรวมกับแฟลกตัวแก้ไข คลาสฐานคือ: TYPE_CLASS_TEXT สำหรับข้อความ, TYPE_CLASS_NUMBER สำหรับตัวเลข, TYPE_CLASS_PHONE สำหรับโทรศัพท์, TYPE_CLASS_DATETIME สำหรับวันที่และเวลา
แต่ละ Keyboard Type มีผลต่อสามด้าน: รูปแบบแป้นพิมพ์เสมือนจริง (อักขระใดที่เห็นได้บนหน้าจอหลัก), การกรองอักขระที่ป้อน (อักขระใดที่ได้รับอนุญาต), และพฤติกรรมการแก้ไขอัตโนมัติ/การเติมอัตโนมัติ ตัวอย่างเช่น แป้นพิมพ์ตัวเลขแสดงเฉพาะตัวเลขและตัวคั่นทศนิยม และจะไม่แสดงตัวอักษรแม้ว่าผู้ใช้จะเปลี่ยนตัวพิมพ์ใหญ่/เล็ก ตามข้อมูลจาก Android Developers Documentation (2026) การรวมคลาสกับแฟลกช่วยให้สามารถสร้างโหมดเฉพาะทางสูง: ข้อความหลายบรรทัดกับการแก้ไขอัตโนมัติ, ตัวเลขทศนิยม, รหัสผ่านที่มีการสนับสนุนการเติมอัตโนมัติ
สำคัญที่จะเข้าใจว่า Keyboard Type เป็นคำแนะนำสำหรับระบบป้อนข้อมูล (IME) แป้นพิมพ์ของบุคคลที่สาม (Gboard, SwiftKey) อาจละเว้นชนิดที่ระบุไว้บางส่วนหากผู้ใช้ตั้งค่าการตั้งค่าของตนเอง อย่างไรก็ตาม แป้นพิมพ์ Android มาตรฐานส่วนใหญ่และ Google Gboard เป็นไปตามชนิดการป้อนที่ระบุอย่างเข้มงวด
// การตั้งค่าชนิดแป้นพิมพ์แบบโปรแกรม
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
TYPE_CLASS_TEXT เป็นคลาสฐานสำหรับการป้อนข้อความ เปิดใช้งานแป้นพิมพ์ QWERTY มาตรฐานที่มีตัวอักษร, ตัวเลข และสัญลักษณ์ คลาสข้อความมีตัวแก้ไขมากที่สุดซึ่งปรับแต่งพฤติกรรม: TYPE_TEXT_FLAG_CAP_SENTENCES (ตัวพิมพ์ใหญ่อัตโนมัติตอนต้นประโยค), TYPE_TEXT_FLAG_AUTO_CORRECT (แก้ไขอัตโนมัติ), TYPE_TEXT_FLAG_MULTI_LINE (โหมดหลายบรรทัด), TYPE_TEXT_FLAG_NO_SUGGESTIONS (ปิดการแนะนำ)
ตัวแก้ไขของ แป้นพิมพ์ข้อความ สามารถรวมกันเพื่อสร้างการกำหนดค่าที่แม่นยำ: ตัวอย่างเช่น text|textCapSentences|textAutoCorrect เหมาะสำหรับช่องป้อนความเห็นที่ต้องการตัวพิมพ์ใหญ่อัตโนมัติและการแก้ไขผิดพิมพ์ ในขณะที่ text|textNoSuggestions ใช้สำหรับการป้อนโค้ดหรือคำศัพท์พิเศษที่การแก้ไขอัตโนมัติอาจเป็นอันตราย
ตามข้อมูลจาก UX Stack Exchange (2025) แป้นพิมพ์ข้อความที่เปิดใช้การแก้ไขอัตโนมัติช่วยเร่งการพิมพ์ได้ 15–25% สำหรับผู้ใช้ทั่วไป แต่สำหรับคำศัพท์ทางเทคนิค (โค้ด, URL, อีเมล) แนะนำให้ปิดการแก้ไขอัตโนมัติ เพราะมักแทนที่คำที่ถูกต้องด้วยคำที่ไม่ถูกต้อง
<!-- Text with autocorrect and capital sentences -->
android:inputType="textCapSentences|textAutoCorrect"
<!-- Text without suggestions and autocorrect -->
android:inputType="textNoSuggestions"
TYPE_CLASS_NUMBER เปิดใช้งานแป้นพิมพ์ตัวเลข ซึ่งแสดงเฉพาะตัวเลข ตัวคั่นทศนิยม และเครื่องหมายลบ ชนิดนี้ใช้สำหรับช่องป้อนข้อมูลจำนวน ราคา อายุ รหัส และข้อมูลตัวเลขอื่น ๆ แป้นพิมพ์ตัวเลขใช้พื้นที่หน้าจอน้อยกว่าแป้นพิมพ์ข้อความ และกำจัดการป้อนตัวอักษรโดยบัํเอิญเหตุ
Number มีตัวแก้ไขสามตัว: TYPE_NUMBER_FLAG_DECIMAL เพิ่มจุด/จุลากตัวเลข TYPE_NUMBER_FLAG_SIGNED เพิ่มเครื่องหมายลบสำหรับตัวเลขติดลบ TYPE_NUMBER_VARIATION_PASSWORD — สำหรับรหัส PIN ที่ตัวเลขแสดงเป็นอักขระที่ซ่อน การรวม number|numberDecimal|numberSigned สร้างช่องที่สมบูรณ์สำหรับการป้อนตัวเลขทศนิยมของทุกเครื่องหมาย
// การป้อนตัวเลขด้วยจุดทศนิยม
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// ตรวจสอบตัวเลขที่ป้อน
val amount = editText.text.toString().toDoubleOrNull() ?: 0.0
TYPE_CLASS_PHONE เปิดใช้งานแป้นพิมพ์โทรศัพท์ ซึ่งแสดงตัวเลขและอักขระที่เฉพาะสำหรับหมายเลขโทรศัพท์: +, #, *, (, ) แตกต่างจากแป้นพิมพ์ตัวเลข phone ยังแสดงรูปแบบตัวอักษรในโหมดเพิ่มเติม เพราะหมายเลขโทรศัพท์อาจมีตัวอักษร (ตัวอย่าง 1-800-FLOWERS) คลาส phone ไม่มีแฟลกเพิ่มเติม แต่รองรับ TYPE_TEXT_VARIATION_PHONE_ETC สำหรับการป้อนหมายเลขอย่าง
TYPE_TEXT_VARIATION_EMAIL_ADDRESS เปิดใช้งานแป้นพิมพ์อีเมล โดยสัญลักษณ์ @ และจุดอยู่บนหน้าจอหลัก และส่วนขยายโดเมนที่พบบ่อย (.com, .net, .org) ก็มีให้เลือก Gboard แสดงปุ่มที่มีโดเมนยอดนิยมเมื่อพิมพ์หลัง @ แป้นพิมพ์อีเมลจะปิดการแก้ไขอัตโนมัติโดยอัตโนมัติ เพราะที่อยู่อีเมลอาจมีการรวมของอักขระที่ไม่ได้มาตรฐาน
ตามข้อมูลจาก Google Material Design Guidelines (2025) สำหรับช่องโทรศัพท์ แนะนำให้ระบุแอตทริบัวต์ android:digits เพิ่มเติม ซึ่งจำกัดชุดของอักขระที่ได้รับอนุญาต สำหรับช่องอีเมล การระบุ autofillHints="email" ก็มีความสำคัญเพื่อรองรับการเติมอัตโนมัติจากตัวจัดการรหัสผ่านและ 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 และ TYPE_NUMBER_VARIATION_PASSWORD เป็นโหมดการป้อนข้อมูลสำหรับข้อมูลที่อ่อนไหว เมื่อตั้ง textPassword อักขระที่ป้อนจะแสดงเป็นจุดหรือเครื่องหมายดาว (ขึ้นอยู่กับเวอร์ชัน Android และแป้นพิมพ์) แป้นพิมพ์ในโหมดนี้จะปิดการแก้ไขอัตโนมัติและการบันทึกคำที่ป้อนลงในพจนานุกรมของผู้ใช้ ป้องกันการรั่วไหลรหัสผ่านผ่านฟีเจอร์การป้อนแบบทำนาย
แป้นพิมพ์ Password ยังปิดการถ่ายหน้าจอของเนื้อหาในช่อง (แฟลก FLAG_SECURE) แม้ว่าพฤติกรรมนี้ขึ้นอยู่กับการนำไปใช้ของแป้นพิมพ์เฉพาะ เริ่มต้นแต่ Android 8.0 (API 26) แป้นพิมพ์รหัสผ่านรองรับการเติมอัตโนมัติผ่านตัวจัดการรหัสผ่านหากตั้งแอตทริบัวต์ importantForAutofill="yes"
ตามข้อมูลจาก Android Security Recommendations (2025) สำหรับช่องรหัสผ่าน แนะนำให้: ตั้ง maxLength เพื่อป้องกันรหัสผ่านที่ยาวเกินไป (ซึ่งอาจเป็นเวกเตอร์การโจมตีฐานข้อมูล), ใช้ inputType="textPassword" ร่วมกับ TextInputLayout และ endIconMode="password_toggle" เพื่อให้ผู้ใช้สามารถตรวจสอบรหัสผ่านที่ป้อนได้ก่อนส่งแบบฟอร์ม
<!-- 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>
การตั้งค่าแบบโปรแกรมของ Keyboard Type ช่วยให้สามารถเปลี่ยนโหมดแป้นพิมพ์ได้อย่างหลากหลายตามบริบทหรือข้อมูลที่ผู้ใช้ป้อน ตัวอย่างเช่น เมื่อเปลี่ยนชนิดของช่อง (ข้อความ/ตัวเลข/วันที่) หรือเมื่อเปลี่ยนเฮลร์ เมธอด setInputType() รับ InputType บิตมาส์และอัพเดตแป้นพิมพ์ทันทีหากช่องอยู่ในโฟกัส
// สลับระหว่างการป้อนข้อความและตัวเลข
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)
}
// ตรวจสอบว่าช่องเป็นตัวเลขหรือไม่
fun isNumericInput(field: EditText): Boolean {
val type = field.inputType
return (type and InputType.TYPE_MASK_CLASS) ==
InputType.TYPE_CLASS_NUMBER
}
// ตรวจสอบว่าเปิดใช้การแก้ไขอัตโนมัติหรือไม่
fun isAutoCorrectEnabled(field: EditText): Boolean {
return (field.inputType and
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0
}
คำถามที่พบบ่อย
หากไม่ได้ระบุ inputType แล้ว EditText จะใช้ TYPE_CLASS_TEXT พร้อมกับแฟลก TYPE_TEXT_FLAG_MULTI_LINE โดยดีฟอล์ต ซึ่งหมายถึงแป้นพิมพ์ QWERTY มาตรฐานและการป้อนหลายบรรทัด สำหรับช่องส่วนใหญ่ แนะนำให้ระบุ inputType อย่างชัดเจนเพื่อให้แป้นพิมพ์ทำงานได้อย่างถูกต้องและการกรองอักขระ
ใช้แอตทริบัวต์ android:imeOptions="actionDone" บน EditText เรื่องนี้จะแทนที่ปุ่ม Enter ด้วยปุ่ม Done ตัวเลือกอื่น: actionSearch (แว่นขยาย), actionNext (ลูกศรริ้วขวา), actionSend (ส่ง) จัดการการกดผ่าน OnEditorActionListener ในโค้ด
ไม่สามารถปิดการสั่นสำหรับช่องเฉพาะได้ — นี้เป็นการตั้งค่าระบบที่ผู้ใช้ควบคุมในการตั้งค่าแป้นพิมพ์ อย่างไรก็ตาม คุณสามารถป้องกันไม่ให้แป้นพิมพ์ปรากฏได้โดยการตั้งค่าแอตทริบัวต์ android:focusable="false" บน EditText หรือการเพิกการแสดงผ่าน dispatchTouchEvent
ตั้งค่า android:inputType="none" หรือเรียกโปรแกรม editText.setKeyListener(null) ช่องจะแสดงข้อความ แต่แป้นพิมพ์จะไม่ปรากฏเมื่อโฟกัส ผู้ใช้จะสามารถเลือกและคัดลอกข้อความได้ แต่ไม่สามารถแก้ไขได้ ตัวเลือกอื่นคือการใช้ TextView กับ textIsSelectable="true"
หลังจากเรียก setInputType() คุณจะต้องแสดงแป้นพิมพ์อีกครั้ง เพราะระบบอาจไม่อัพเดต IME โดยอัตโนมัติ เรียก InputMethodManager.restartInput(view) เพื่อบังคับให้อัพเดต หากช่องไม่ได้รับโฟกัส ให้เรียก requestFocus() ก่อน จากนั้น restartInput
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ