Android TextWatcher.afterTextChanged กับ TextWatcher.onTextChanged


คำตอบ:


199

เหตุการณ์เหล่านี้เรียกตามลำดับต่อไปนี้:

  1. beforeTextChanged (CharSequence s เริ่มต้น int นับ int, int หลัง)
    ซึ่งหมายความว่าตัวอักษรกำลังจะถูกแทนที่ด้วยข้อความใหม่ ข้อความไม่สามารถแก้ไขได้
    ใช้:เมื่อคุณต้องการดูข้อความเก่าที่กำลังจะเปลี่ยนแปลง

  2. onTextChanged (CharSequence s เริ่มต้น int, int ก่อนนับ int)
    มีการเปลี่ยนแปลงตัวละครบางตัวเพิ่งถูกแทนที่ ข้อความไม่สามารถแก้ไขได้
    ใช้:เมื่อคุณต้องการดูว่าอักขระใดในข้อความใหม่

  3. afterTextChanged (แก้ไข s)
    เช่นเดียวกับด้านบนยกเว้นตอนนี้แก้ไขข้อความได้แล้ว
    ใช้:เมื่อคุณต้องการดูและอาจแก้ไขข้อความใหม่

ถ้าฉันแค่รับฟังการเปลี่ยนแปลงEditTextฉันก็ไม่จำเป็นต้องใช้สองวิธีแรกเลย ฉันจะได้รับค่าใหม่ในวิธีที่สามและแก้ไขข้อความใหม่หากจำเป็น อย่างไรก็ตามหากฉันต้องติดตามการเปลี่ยนแปลงที่แน่นอนซึ่งเกิดขึ้นกับค่าฉันจะใช้สองวิธีแรก ถ้าฉันต้องการแก้ไขข้อความหลังจากฟังการเปลี่ยนแปลงฉันจะทำในวิธีที่สาม


ช่วยให้ฉันเข้าใจว่าเหตุใดการเปลี่ยนข้อความใน onTextChanged จึงนำไปสู่ ​​ANR
Sukhvir Singh

12

โมฆะสาธารณะ afterTextChanged (แก้ไขได้)

วิธีนี้เรียกว่าเพื่อแจ้งให้คุณทราบว่าsมีการเปลี่ยนแปลงข้อความภายในบางส่วน เป็นเรื่องถูกต้องที่จะทำการเปลี่ยนแปลงเพิ่มเติมsจากการเรียกกลับนี้ แต่ระวังอย่าให้ตัวเองวนไปวนมาไม่สิ้นสุดเพราะการเปลี่ยนแปลงใด ๆ ที่คุณทำจะทำให้วิธีนี้ถูกเรียกซ้ำอีกครั้ง (คุณยังไม่ได้บอกว่าการเปลี่ยนแปลงที่เกิดขึ้นเพราะอื่น ๆ afterTextChanged () วิธีอาจมีการเปลี่ยนแปลงอื่น ๆ และไม่ถูกต้องชดเชย. แต่ถ้าคุณต้องการที่จะรู้ว่าที่นี่คุณสามารถใช้setSpan(Object, int, int, int)ในonTextChanged(CharSequence, int, int, int)การทำเครื่องหมายสถานที่ของคุณแล้วมองขึ้นไปจากที่นี่ที่ ช่วงสิ้นสุดลง

โมฆะสาธารณะ beforeTextChanged (CharSequence s, int start, int count, int after)

วิธีการนี้เรียกว่าแจ้งให้ทราบว่าภายในsของcountตัวละครเริ่มต้นที่กำลังจะถูกแทนที่ด้วยข้อความใหม่ที่มีความยาวstart afterเป็นข้อผิดพลาดในการพยายามทำการเปลี่ยนแปลงsจากการติดต่อกลับนี้

โมฆะสาธารณะ onTextChanged (CharSequence s, int start, int ก่อน, int count)

วิธีการนี้เรียกว่าแจ้งให้ทราบว่าภายในsของcountตัวละครเริ่มต้นที่มีการเปลี่ยนเพียงแค่ข้อความเก่าที่มีความยาวstart beforeเป็นข้อผิดพลาดในการพยายามทำการเปลี่ยนแปลงsจากการติดต่อกลับนี้

ขวาจากReference Android สำหรับ TextWatcher


ทำไมคุณแค่คัดลอกรหัส API? หลายครั้งที่ API เป็น "มนุษย์ไม่สามารถอ่านได้"
matua

@matua คำถาม / คำตอบนี้มาจาก 11 ปีที่แล้ว
GregD

ฉันเดาว่าควรบล็อกความคิดเห็น :)
matua

0

Android Textwatcher เป็นทริกเกอร์ชนิดหนึ่งที่เรียกว่าการเปลี่ยนแปลงข้อความของฟิลด์อินพุต

afterTextChanged (Editable s)- วิธีนี้เรียกว่าเมื่อข้อความถูกเปลี่ยนแปลง เพราะการเปลี่ยนแปลงใด ๆ ที่คุณทำจะทำให้เกิดวิธีการนี้จะเรียกว่าอีกครั้งซ้ำคุณต้องระวังเกี่ยวกับการดำเนินการที่นี่มิฉะนั้นมันอาจนำไปสู่วง จำกัด

onTextChanged (CharSequence s, int start, int before, int count)- วิธีนี้เรียกว่าเพื่อแจ้งให้คุณทราบว่าภายใน s อักขระนับที่เริ่มต้นจากจุดเริ่มต้นเพิ่งแทนที่ข้อความเก่าที่มีความยาวก่อนหน้านี้ เป็นข้อผิดพลาดในการพยายามทำการเปลี่ยนแปลงจากการโทรกลับนี้


6
การคัดลอก / วางเอกสารไม่เป็นประโยชน์และไม่ตอบคำถาม
David Wasser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.