InputFilter คืออินเทอร์เฟซของ Android SDK ที่ช่วยให้สามารถสกัดกั้นและแก้ไขข้อความที่ป้อนก่อนที่จะแสดงใน EditText นักพัฒนากำหนดกฎการกรอง: อักขระที่อนุญาต, ความยาวสูงสุด, รูปแบบอินพุต ตามข้อมูลจาก Android Developers, 2026, InputFilter ถูกใช้เพื่อจำกัดการป้อนตัวอักษร ตัวเลข อักขระพิเศษ และจัดรูปแบบข้อความโดยอัตโนมัติ แตกต่างจาก TextWatcher ตัวกรองจะทำงานก่อนที่ข้อความจะเปลี่ยน ซึ่งป้องกันการป้อนข้อมูลที่ไม่ถูกต้องในระดับต้นทาง
ประเด็นสำคัญ
InputFilter คืออินเทอร์เฟซเชิงฟังก์ชันจากแพ็คเกจ android.text ที่กำหนดเมธอดเดียว filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) มันถูกเรียกโดยอัตโนมัติทุกครั้งที่ผู้ใช้พยายามพิมพ์ วาง หรือแทนที่ข้อความใน EditText ค่าที่ส่งกลับกำหนดว่าการเปลี่ยนแปลงจะถูกยอมรับ ปฏิเสธ หรือแก้ไข
วัตถุประสงค์หลักของ InputFilter คือ การป้องกันอินพุตที่ไม่ถูกต้อง ก่อนที่ข้อความจะเข้าสู่ฟิลด์ ตัวอย่างเช่น ในฟิลด์ป้อนตัวเลขโทรศัพท์ ตัวกรองสามารถบล็อกตัวอักษรและอักขระพิเศษได้ ในฟิลด์รหัสผ่าน สามารถบังคับใช้ความยาวขั้นต่ำได้ ในฟิลด์รหัสยืนยัน สามารถอนุญาตเฉพาะตัวเลขเท่านั้น แตกต่างจากการตรวจสอบผ่าน TextWatcher ตัวกรองป้องกันไม่ให้อักขระที่ผิดพลาดปรากฏบนหน้าจอ
ตาม Android Developers InputFilter ถูกใช้ในคอมโพเนนต์ Material Design ทั้งหมดสำหรับ TextInputEditText ไลบรารีเช่น PhoneNumberFormattingTextWatcher รวม TextWatcher และ InputFilter เพื่อการจัดรูปแบบที่สมบูรณ์ แนะนำให้ใช้ InputFilter เป็นแนวป้องกันแรกต่ออินพุตที่ไม่ถูกต้อง และ TextWatcher สำหรับตรรกะเพิ่มเติมหลังจากอินพุต
เมธอด filter รับพารามิเตอร์หกตัว: source — ข้อความที่ป้อน, start และ end — ขอบเขตของส่วนที่ป้อน, dest — เนื้อหาปัจจุบันของฟิลด์, dstart และ dend — ตำแหน่งที่แทรก หากเมธอดส่งคืน null การเปลี่ยนแปลงจะถูกยอมรับโดยไม่มีการแก้ไข หากส่งคืนสตริงว่าง “” การเปลี่ยนแปลงจะถูกบล็อก หากส่งคืน CharSequence ใหม่ ข้อความต้นฉบับจะถูกแทนที่ด้วยค่าที่ส่งคืน
ตัวอย่างเช่น หากผู้ใช้พยายามพิมพ์ ตัวอักษร “a” ในฟิลด์ที่อนุญาตเฉพาะตัวเลข ตัวกรองจะส่งคืน “” และอักขระจะไม่ปรากฏ หากป้อน “123” ตัวกรองอาจส่งคืน “1-2-3” โดยเพิ่มตัวคั่น กลไกนี้ช่วยให้จัดรูปแบบหมายเลขโทรศัพท์ วันที่ และข้อมูลที่มีโครงสร้างอื่น ๆ โดยอัตโนมัติโดยไม่ต้องใช้ TextWatcher
สำคัญ: InputFilter ไม่แก้ไขแหล่งข้อมูลต้นฉบับ มันเพียงส่งคืนเวอร์ชันที่กรองแล้ว Android จะใช้ค่าที่ส่งคืนกับ Editable เอง หากตัวกรองส่งคืน null ไม่จำเป็นต้องดำเนินการเพิ่มเติม หากส่งคืนข้อความที่แก้ไข Android จะลบช่วงต้นฉบับและแทรกช่วงใหม่
Android SDK มี การใช้งานในตัว หลายอย่างของ InputFilter ที่พบมากที่สุดคือ InputFilter.LengthFilter ซึ่งจำกัดความยาวสูงสุดของข้อความ ตัวสร้างรับจำนวนเต็ม — จำนวนอักขระสูงสุด หากความยาวข้อความปัจจุบันบวกอินพุตเกินขีดจำกัด ตัวกรองจะส่งคืนสตริงที่ถูกตัดทอน ป้องกันไม่ให้เกินขีดจำกัด
InputFilter.AllCaps ก็พร้อมใช้งานเช่นกัน ซึ่งแปลงอักขระอินพุตทั้งหมดเป็นตัวพิมพ์ใหญ่ ใช้ในฟิลด์สำหรับรหัส รหัสไปรษณีย์ และข้อมูลอื่น ๆ ที่ตัวพิมพ์มีความสำคัญ ตัวกรองไม่เพียงแค่บล็อกตัวพิมพ์เล็กแต่แปลงมัน ซึ่งสะดวกสำหรับผู้ใช้ — พวกเขาเห็นผลลัพธ์ของการแปลง
InputFilter.LengthFilter สำหรับหลายขีดจำกัด — ผ่านการรวมกันของตัวกรอง ตัวอย่างเช่น หากคุณต้องการจำกัดความยาวเป็น 20 อักขระและอนุญาตเฉพาะตัวเลข คุณสามารถใช้ LengthFilter + ตัวกรองตัวเลขแบบกำหนดเอง ตัวกรองแต่ละตัวทำงานตามลำดับ และผลลัพธ์ของตัวก่อนหน้าจะกลายเป็น dest สำหรับตัวถัดไป
| ตัวกรอง | วัตถุประสงค์ | ตัวอย่างการใช้งาน |
|---|---|---|
| LengthFilter | การจำกัดความยาวข้อความ | ฟิลด์ชื่อสูงสุด 50 อักขระ |
| AllCaps | การแปลงเป็นตัวพิมพ์ใหญ่ | ฟิลด์รหัสไปรษณีย์ |
| InputFilter แบบกำหนดเอง | กฎการกรองตามต้องการ | เฉพาะตัวเลข ห้ามอักขระพิเศษ |
ในการสร้าง ตัวกรองแบบกำหนดเอง คุณต้องใช้งานอินเทอร์เฟซ InputFilter และแทนที่เมธอด filter งานทั่วไปคือตัวกรองที่อนุญาตเฉพาะตัวเลข ในกรณีนี้ เมธอดจะตรวจสอบอักขระแต่ละตัวจาก source โดยใช้ Character.isDigit และส่งคืนสตริงที่กรองแล้วหรือ null หากอักขระทั้งหมดถูกต้อง
class DigitsInputFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
val sb = StringBuilder()
for (i in start until end) {
val c = source?.get(i)
if (c != null && Character.isDigit(c)) {
sb.append(c)
}
}
return if (sb.length == end - start) null else sb
}
}
ตัวอย่าง DigitsInputFilter วนผ่านอักขระทั้งหมดของข้อความที่ป้อนและเก็บเฉพาะตัวเลข หากอักขระทั้งหมดผ่านการตรวจสอบ เมธอดจะส่งคืน null — นี่เป็นกรณีที่เหมาะสมที่สุดเนื่องจากไม่ต้องใช้การดำเนินการหน่วยความจำเพิ่มเติม หากอักขระบางตัวถูกทิ้ง จะส่งคืนสตริงใหม่ และมีเพียงตัวเลขเท่านั้นที่ไปถึง EditText
อีกสถานการณ์ที่พบบ่อยคือ ตัวกรองสำหรับบล็อกอักขระพิเศษ การใช้งานคล้ายกัน: ตรวจสอบอักขระแต่ละตัวผ่าน Character.isLetterOrDigit หรือเปรียบเทียบกับรายการอักขระที่อนุญาต ตัวกรองดังกล่าวใช้ในฟิลด์ชื่อผู้ใช้ สตริงค้นหา และสถานที่อื่น ๆ ที่ไม่อนุญาตให้ใช้อักขระพิเศษ
ตัวกรองถูกตั้งค่าบน EditText ผ่าน เมธอด setFilters(InputFilter[]) อาร์เรย์ตัวกรองจะแทนที่ตัวกรองปัจจุบัน ดังนั้นหากคุณต้องการเพิ่มตัวกรองให้กับตัวกรองที่มีอยู่ คุณต้องรับตัวกรองปัจจุบันผ่าน getFilters() สร้างอาร์เรย์ใหม่และตั้งค่ากลับ EditText มีตัวกรองเริ่มต้นหนึ่งตัว — LengthFilter ซึ่งตั้งค่าผ่าน android:maxLength ใน XML
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
ในตัวอย่าง มีการตั้งค่าตัวกรองสองตัว: DigitsInputFilter (เฉพาะตัวเลข) และ LengthFilter (สูงสุด 10 อักขระ) ลำดับของตัวกรองในอาร์เรย์มีความสำคัญ: ตัวกรองแรกได้รับอินพุตต้นฉบับ ประมวลผล และส่งผลลัพธ์ไปยังตัวที่สอง หาก DigitsInputFilter กรองอักขระบางตัวออก LengthFilter จะเห็นข้อความที่กรองแล้วและใช้ข้อจำกัดความยาวกับข้อความนั้น
ตัวกรองยังสามารถตั้งค่าผ่านแอตทริบิวต์ XML android:inputType ซึ่งจะเพิ่มตัวกรองบางตัวโดยอัตโนมัติ ตัวอย่างเช่น inputType=“phone” เพิ่ม DigitsKeyListener และอนุญาตเฉพาะตัวเลขและอักขระพิเศษบางตัว อย่างไรก็ตาม สำหรับการควบคุมการกรองอย่างสมบูรณ์ แนะนำให้ใช้ setFilters โดยการเขียนโปรแกรม โดยเฉพาะเมื่อรวมหลายกฎ
InputFilter และ TextWatcher ทำ หน้าที่ต่างกัน และมักใช้ร่วมกัน InputFilter ทำงานในระดับอินพุต — ป้องกันไม่ให้อักขระไม่ถูกต้องเข้าสู่ฟิลด์ TextWatcher ทำงานหลังจากอินพุต — ช่วยให้ตอบสนองต่อการเปลี่ยนแปลง ดำเนินการตรวจสอบกฎที่ซับซ้อน และอัปเดต UI การรวมกันของทั้งสองวิธีให้ผลลัพธ์ที่ดีที่สุด
ตัวอย่างเช่น สำหรับฟิลด์ป้อน อีเมล: InputFilter สามารถบล็อกช่องว่างและอักขระซีริลลิกในระดับอินพุต ในขณะที่ TextWatcher สามารถตรวจสอบความสอดคล้องตามรูปแบบอีเมลอย่างสมบูรณ์หลังการเปลี่ยนแปลงแต่ละครั้ง ตัวแรกป้องกันข้อผิดพลาดที่ชัดเจน ตัวที่สองป้องกันข้อผิดพลาดเชิงโครงสร้าง การแบ่งแยกความรับผิดชอบนี้ทำให้โค้ดสะอาดขึ้นและลดภาระการตรวจสอบ
ตาม Material Design Guidelines ควรใช้ตัวกรองกับฟิลด์ที่มีข้อจำกัดเข้มงวด: หมายเลขโทรศัพท์ รหัสยืนยัน รหัส PIN รหัสไปรษณีย์ สำหรับฟิลด์ที่มีการตรวจสอบแบบยืดหยุ่น — ชื่อ ที่อยู่ ความคิดเห็น — เฉพาะ TextWatcher ก็เพียงพอที่จะไม่ขัดขวางผู้ใช้จากการป้อนค่าที่ถูกต้องแต่ไม่ได้มาตรฐาน
| เกณฑ์ | InputFilter | TextWatcher |
|---|---|---|
| ช่วงเวลาที่ทำงาน | ก่อนการเปลี่ยนแปลงข้อความ | หลังการเปลี่ยนแปลงข้อความ |
| วัตถุประสงค์ | บล็อกอักขระไม่ถูกต้อง | ตอบสนองต่อการเปลี่ยนแปลง, ตรวจสอบ, UI |
| ค่าที่ส่งคืน | ข้อความที่กรองแล้วหรือ null | ไม่มี (void) |
| การนำไปใช้ | setFilters() | addTextChangedListener() |
คำถามที่พบบ่อย
InputFilter สกัดกั้นอินพุตก่อนการเปลี่ยนแปลงข้อความและสามารถบล็อกหรือแก้ไขได้ TextWatcher ถูกเรียกหลังการเปลี่ยนแปลงและช่วยให้ตอบสนองต่อค่าใหม่ InputFilter คือการป้องกันเชิงป้องกัน TextWatcher คือการประมวลผลภายหลัง สำหรับการตรวจสอบแบบฟอร์มที่สมบูรณ์ แนะนำให้ใช้ทั้งสองวิธี
ส่งอาร์เรย์ของตัวกรองไปยัง เมธอด setFilters() ตัวกรองทำงานตามลำดับในลำดับอาร์เรย์ เพื่อไม่ให้สูญเสียตัวกรองที่มีอยู่ ให้รับตัวกรองปัจจุบันผ่าน getFilters() เพิ่มตัวกรองใหม่ในสำเนาของอาร์เรย์และตั้งค่ากลับผ่าน setFilters อย่าเขียนทับตัวกรองโดยไม่พิจารณาตัวกรองที่ติดตั้งไว้แล้ว
ได้ InputFilter สามารถ แก้ไขอินพุต โดยส่งคืน CharSequence ที่แก้ไขแล้ว ตัวอย่างเช่น ตัวกรองหมายเลขโทรศัพท์สามารถเพิ่มช่องว่างหรือวงเล็บได้ อย่างไรก็ตาม สำหรับการจัดรูปแบบที่ซับซ้อน ควรรวม InputFilter กับ TextWatcher เนื่องจากตัวกรองเน้นที่การบล็อกมากกว่าการประมวลผลภายหลัง
อักขระใด ๆ: ช่องว่าง, ตัวอักษร, ตัวเลข, อักขระพิเศษ, อักขระ Unicode ในตัวกรองแบบกำหนดเอง คุณกำหนดเงื่อนไขโดยใช้ Character.isLetter, isDigit, isWhitespace หรือเปรียบเทียบกับบัญชีดำ/บัญชีขาว ตัวกรองสามารถอนุญาตเฉพาะภาษาละติน เฉพาะซีริลลิก หรือเฉพาะชุดอักขระที่กำหนด
ไม่ InputFilter ทำงานเฉพาะเมื่อผู้ใช้ป้อนข้อความหรือวางจากคลิปบอร์ด หากตั้งค่าข้อความโดยโปรแกรมผ่าน setText() ตัวกรองจะไม่ถูกนำไปใช้ ในการตรวจสอบข้อความโดยโปรแกรม ให้ใช้การตรวจสอบผ่าน TextWatcher หรือการตรวจสอบอย่างชัดเจนก่อนตั้งค่า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ