InputFilter: คืออะไร, อินเทอร์เฟซ InputFilter และการกรองใน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-08 เวลาอ่าน: 5 นาที

InputFilter คืออินเทอร์เฟซของ Android SDK ที่ช่วยให้สามารถสกัดกั้นและแก้ไขข้อความที่ป้อนก่อนที่จะแสดงใน EditText นักพัฒนากำหนดกฎการกรอง: อักขระที่อนุญาต, ความยาวสูงสุด, รูปแบบอินพุต ตามข้อมูลจาก Android Developers, 2026, InputFilter ถูกใช้เพื่อจำกัดการป้อนตัวอักษร ตัวเลข อักขระพิเศษ และจัดรูปแบบข้อความโดยอัตโนมัติ แตกต่างจาก TextWatcher ตัวกรองจะทำงานก่อนที่ข้อความจะเปลี่ยน ซึ่งป้องกันการป้อนข้อมูลที่ไม่ถูกต้องในระดับต้นทาง

ประเด็นสำคัญ

  • InputFilter คืออินเทอร์เฟซ Android สำหรับจำกัดและจัดรูปแบบอินพุตใน EditText และ TextView
  • เมธอด filter ถูกเรียกก่อนการเปลี่ยนแปลงข้อความและส่งคืน CharSequence ที่กรองแล้วหรือ null หากอนุญาตให้เปลี่ยนแปลง
  • InputFilter.LengthFilter คือการใช้งานมาตรฐานสำหรับจำกัดความยาวสูงสุดของข้อความ
  • ตัวกรองแบบกำหนดเอง อนุญาตให้ห้ามอักขระบางตัว, ใช้มาสก์อินพุต หรือแปลงตัวพิมพ์
  • ห่วงโซ่ตัวกรอง — สามารถใช้ InputFilter หลายตัวกับ EditText เดียวกันพร้อมกัน และจะทำงานตามลำดับ

InputFilter คืออะไรและทำไมจึงจำเป็น?

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 สำหรับตรรกะเพิ่มเติมหลังจากอินพุต

InputFilter ทำงานอย่างไร

เมธอด filter รับพารามิเตอร์หกตัว: source — ข้อความที่ป้อน, start และ end — ขอบเขตของส่วนที่ป้อน, dest — เนื้อหาปัจจุบันของฟิลด์, dstart และ dend — ตำแหน่งที่แทรก หากเมธอดส่งคืน null การเปลี่ยนแปลงจะถูกยอมรับโดยไม่มีการแก้ไข หากส่งคืนสตริงว่าง “” การเปลี่ยนแปลงจะถูกบล็อก หากส่งคืน CharSequence ใหม่ ข้อความต้นฉบับจะถูกแทนที่ด้วยค่าที่ส่งคืน

ตัวอย่างเช่น หากผู้ใช้พยายามพิมพ์ ตัวอักษร “a” ในฟิลด์ที่อนุญาตเฉพาะตัวเลข ตัวกรองจะส่งคืน “” และอักขระจะไม่ปรากฏ หากป้อน “123” ตัวกรองอาจส่งคืน “1-2-3” โดยเพิ่มตัวคั่น กลไกนี้ช่วยให้จัดรูปแบบหมายเลขโทรศัพท์ วันที่ และข้อมูลที่มีโครงสร้างอื่น ๆ โดยอัตโนมัติโดยไม่ต้องใช้ TextWatcher

สำคัญ: InputFilter ไม่แก้ไขแหล่งข้อมูลต้นฉบับ มันเพียงส่งคืนเวอร์ชันที่กรองแล้ว Android จะใช้ค่าที่ส่งคืนกับ Editable เอง หากตัวกรองส่งคืน null ไม่จำเป็นต้องดำเนินการเพิ่มเติม หากส่งคืนข้อความที่แก้ไข Android จะลบช่วงต้นฉบับและแทรกช่วงใหม่

ตัวกรองมาตรฐานใน Android SDK

Android SDK มี การใช้งานในตัว หลายอย่างของ InputFilter ที่พบมากที่สุดคือ InputFilter.LengthFilter ซึ่งจำกัดความยาวสูงสุดของข้อความ ตัวสร้างรับจำนวนเต็ม — จำนวนอักขระสูงสุด หากความยาวข้อความปัจจุบันบวกอินพุตเกินขีดจำกัด ตัวกรองจะส่งคืนสตริงที่ถูกตัดทอน ป้องกันไม่ให้เกินขีดจำกัด

InputFilter.AllCaps ก็พร้อมใช้งานเช่นกัน ซึ่งแปลงอักขระอินพุตทั้งหมดเป็นตัวพิมพ์ใหญ่ ใช้ในฟิลด์สำหรับรหัส รหัสไปรษณีย์ และข้อมูลอื่น ๆ ที่ตัวพิมพ์มีความสำคัญ ตัวกรองไม่เพียงแค่บล็อกตัวพิมพ์เล็กแต่แปลงมัน ซึ่งสะดวกสำหรับผู้ใช้ — พวกเขาเห็นผลลัพธ์ของการแปลง

InputFilter.LengthFilter สำหรับหลายขีดจำกัด — ผ่านการรวมกันของตัวกรอง ตัวอย่างเช่น หากคุณต้องการจำกัดความยาวเป็น 20 อักขระและอนุญาตเฉพาะตัวเลข คุณสามารถใช้ LengthFilter + ตัวกรองตัวเลขแบบกำหนดเอง ตัวกรองแต่ละตัวทำงานตามลำดับ และผลลัพธ์ของตัวก่อนหน้าจะกลายเป็น dest สำหรับตัวถัดไป

ตัวกรองวัตถุประสงค์ตัวอย่างการใช้งาน
LengthFilterการจำกัดความยาวข้อความฟิลด์ชื่อสูงสุด 50 อักขระ
AllCapsการแปลงเป็นตัวพิมพ์ใหญ่ฟิลด์รหัสไปรษณีย์
InputFilter แบบกำหนดเองกฎการกรองตามต้องการเฉพาะตัวเลข ห้ามอักขระพิเศษ

การสร้าง InputFilter แบบกำหนดเอง

ในการสร้าง ตัวกรองแบบกำหนดเอง คุณต้องใช้งานอินเทอร์เฟซ InputFilter และแทนที่เมธอด filter งานทั่วไปคือตัวกรองที่อนุญาตเฉพาะตัวเลข ในกรณีนี้ เมธอดจะตรวจสอบอักขระแต่ละตัวจาก source โดยใช้ Character.isDigit และส่งคืนสตริงที่กรองแล้วหรือ null หากอักขระทั้งหมดถูกต้อง

kotlin
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 หรือเปรียบเทียบกับรายการอักขระที่อนุญาต ตัวกรองดังกล่าวใช้ในฟิลด์ชื่อผู้ใช้ สตริงค้นหา และสถานที่อื่น ๆ ที่ไม่อนุญาตให้ใช้อักขระพิเศษ

การนำ InputFilter ไปใช้กับ EditText

ตัวกรองถูกตั้งค่าบน EditText ผ่าน เมธอด setFilters(InputFilter[]) อาร์เรย์ตัวกรองจะแทนที่ตัวกรองปัจจุบัน ดังนั้นหากคุณต้องการเพิ่มตัวกรองให้กับตัวกรองที่มีอยู่ คุณต้องรับตัวกรองปัจจุบันผ่าน getFilters() สร้างอาร์เรย์ใหม่และตั้งค่ากลับ EditText มีตัวกรองเริ่มต้นหนึ่งตัว — LengthFilter ซึ่งตั้งค่าผ่าน android:maxLength ใน XML

kotlin
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 และการตรวจสอบอินพุต

InputFilter และ TextWatcher ทำ หน้าที่ต่างกัน และมักใช้ร่วมกัน InputFilter ทำงานในระดับอินพุต — ป้องกันไม่ให้อักขระไม่ถูกต้องเข้าสู่ฟิลด์ TextWatcher ทำงานหลังจากอินพุต — ช่วยให้ตอบสนองต่อการเปลี่ยนแปลง ดำเนินการตรวจสอบกฎที่ซับซ้อน และอัปเดต UI การรวมกันของทั้งสองวิธีให้ผลลัพธ์ที่ดีที่สุด

ตัวอย่างเช่น สำหรับฟิลด์ป้อน อีเมล: InputFilter สามารถบล็อกช่องว่างและอักขระซีริลลิกในระดับอินพุต ในขณะที่ TextWatcher สามารถตรวจสอบความสอดคล้องตามรูปแบบอีเมลอย่างสมบูรณ์หลังการเปลี่ยนแปลงแต่ละครั้ง ตัวแรกป้องกันข้อผิดพลาดที่ชัดเจน ตัวที่สองป้องกันข้อผิดพลาดเชิงโครงสร้าง การแบ่งแยกความรับผิดชอบนี้ทำให้โค้ดสะอาดขึ้นและลดภาระการตรวจสอบ

ตาม Material Design Guidelines ควรใช้ตัวกรองกับฟิลด์ที่มีข้อจำกัดเข้มงวด: หมายเลขโทรศัพท์ รหัสยืนยัน รหัส PIN รหัสไปรษณีย์ สำหรับฟิลด์ที่มีการตรวจสอบแบบยืดหยุ่น — ชื่อ ที่อยู่ ความคิดเห็น — เฉพาะ TextWatcher ก็เพียงพอที่จะไม่ขัดขวางผู้ใช้จากการป้อนค่าที่ถูกต้องแต่ไม่ได้มาตรฐาน

เกณฑ์InputFilterTextWatcher
ช่วงเวลาที่ทำงานก่อนการเปลี่ยนแปลงข้อความหลังการเปลี่ยนแปลงข้อความ
วัตถุประสงค์บล็อกอักขระไม่ถูกต้องตอบสนองต่อการเปลี่ยนแปลง, ตรวจสอบ, UI
ค่าที่ส่งคืนข้อความที่กรองแล้วหรือ nullไม่มี (void)
การนำไปใช้setFilters()addTextChangedListener()

คำถามที่พบบ่อย

InputFilter และ TextWatcher แตกต่างกันอย่างไร?

InputFilter สกัดกั้นอินพุตก่อนการเปลี่ยนแปลงข้อความและสามารถบล็อกหรือแก้ไขได้ TextWatcher ถูกเรียกหลังการเปลี่ยนแปลงและช่วยให้ตอบสนองต่อค่าใหม่ InputFilter คือการป้องกันเชิงป้องกัน TextWatcher คือการประมวลผลภายหลัง สำหรับการตรวจสอบแบบฟอร์มที่สมบูรณ์ แนะนำให้ใช้ทั้งสองวิธี

วิธีใช้ตัวกรองหลายตัวกับ EditText?

ส่งอาร์เรย์ของตัวกรองไปยัง เมธอด setFilters() ตัวกรองทำงานตามลำดับในลำดับอาร์เรย์ เพื่อไม่ให้สูญเสียตัวกรองที่มีอยู่ ให้รับตัวกรองปัจจุบันผ่าน getFilters() เพิ่มตัวกรองใหม่ในสำเนาของอาร์เรย์และตั้งค่ากลับผ่าน setFilters อย่าเขียนทับตัวกรองโดยไม่พิจารณาตัวกรองที่ติดตั้งไว้แล้ว

สามารถใช้ InputFilter สำหรับการจัดรูปแบบข้อความได้หรือไม่?

ได้ InputFilter สามารถ แก้ไขอินพุต โดยส่งคืน CharSequence ที่แก้ไขแล้ว ตัวอย่างเช่น ตัวกรองหมายเลขโทรศัพท์สามารถเพิ่มช่องว่างหรือวงเล็บได้ อย่างไรก็ตาม สำหรับการจัดรูปแบบที่ซับซ้อน ควรรวม InputFilter กับ TextWatcher เนื่องจากตัวกรองเน้นที่การบล็อกมากกว่าการประมวลผลภายหลัง

อักขระใดบ้างที่สามารถบล็อกผ่าน InputFilter?

อักขระใด ๆ: ช่องว่าง, ตัวอักษร, ตัวเลข, อักขระพิเศษ, อักขระ Unicode ในตัวกรองแบบกำหนดเอง คุณกำหนดเงื่อนไขโดยใช้ Character.isLetter, isDigit, isWhitespace หรือเปรียบเทียบกับบัญชีดำ/บัญชีขาว ตัวกรองสามารถอนุญาตเฉพาะภาษาละติน เฉพาะซีริลลิก หรือเฉพาะชุดอักขระที่กำหนด

InputFilter ทำงานกับการเปลี่ยนแปลงข้อความโดยโปรแกรมหรือไม่?

ไม่ InputFilter ทำงานเฉพาะเมื่อผู้ใช้ป้อนข้อความหรือวางจากคลิปบอร์ด หากตั้งค่าข้อความโดยโปรแกรมผ่าน setText() ตัวกรองจะไม่ถูกนำไปใช้ ในการตรวจสอบข้อความโดยโปรแกรม ให้ใช้การตรวจสอบผ่าน TextWatcher หรือการตรวจสอบอย่างชัดเจนก่อนตั้งค่า

สรุป

  • InputFilter คืออินเทอร์เฟซ Android สำหรับการกรองและจัดรูปแบบอินพุตในระดับอักขระก่อนแสดงใน EditText
  • เมธอด filter ส่งคืน null เพื่ออนุญาตอินพุต, “” เพื่อบล็อก หรือ CharSequence ใหม่เพื่อแก้ไข
  • LengthFilter และ AllCaps เป็นตัวกรอง Android SDK มาตรฐานสำหรับการจำกัดความยาวและการแปลงตัวพิมพ์
  • ตัวกรองแบบกำหนดเอง ถูกสร้างขึ้นโดยการใช้งานอินเทอร์เฟซ InputFilter ด้วยตรรกะการตรวจสอบอักขระแบบกำหนดเอง
  • ห่วงโซ่ตัวกรอง อนุญาตให้รวมหลายกฎที่ทำงานตามลำดับ
  • InputFilter และ TextWatcher ไม่ขัดแย้งแต่เสริมซึ่งกันและกัน: ตัวแรกบล็อกอักขระ ตัวที่สองตอบสนองต่อการเปลี่ยนแปลง
  • การเปลี่ยนแปลงข้อความโดยโปรแกรม ผ่าน setText() ไม่ผ่าน InputFilter — จำเป็นต้องมีการตรวจสอบแยกต่างหาก

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม