TextWatcher: bu nima, TextWatcher interfeysi va Android-da tatbiq etish

Muallif: IT Sectr Nashr etilgan: 2026-07-08 O'qish vaqti: 6 daq

TextWatcher — bu Android interfeysi bo'lib, EditText va boshqa TextView-larda matn o'zgarishlarini real vaqtda kuzatish imkonini beradi. Dasturchi uch bosqichda bildirishnoma oladi: o'zgarishdan oldin, o'zgarish paytida va matn mazmuni o'zgarganidan keyin. Android Developers, 2026 ma'lumotlariga ko'ra, TextWatcher ko'pchilik ilovalarda kiritishni tekshirish, belgilarni hisoblash, avtomatik to'ldirish bilan qidiruvni amalga oshirish va matnni dinamik formatlash uchun qo'llaniladi. Interfeys har bir tugma bosilishiga darhol reaksiya talab qilinadigan formalarda ajralmas hisoblanadi.

Asosiy fikrlar

  • TextWatcher — TextView va EditText-dagi matn o'zgarishlarini tinglash uchun Android SDK-ga o'rnatilgan interfeys.
  • Interfeys uch metoddan iborat: beforeTextChanged, onTextChanged va afterTextChanged, har biri o'zgarishning o'z bosqichi uchun javob beradi.
  • afterTextChanged metodi foydalanuvchi kiritishni tugatgandan so'ng maydonni tekshirish uchun eng qulaydir.
  • Rekursiv chaqiruv — keng tarqalgan xato: TextWatcher ichida matnni o'zgartirish cheksiz siklga olib keladi.
  • TextWatcher qidiruv maydonlarida, formalarni tekshirishda, belgilarni hisoblashda va telefon raqamini avtomatik formatlashda qo'llaniladi.

TextWatcher nima va nima uchun kerak?

TextWatcher — android.text paketidagi interfeys bo'lib, Editable obyektlaridagi matn o'zgarishlari haqida ilovani xabardor qiladi. Har bir belgi kiritilishi, o'chirilishi yoki almashtirilishida TextWatcher ketma-ket uchta metodni chaqiradi, o'zgarishlarning joylashuvi haqida ma'lumot uzatadi. Bu dasturchiga foydalanuvchi harakatlariga darhol — qo'shimcha tugmalar yoki triggerlarsiz — reaksiya qilish imkonini beradi.

Asosiy foydalanish stsenariylariga maydonlarni real vaqtda tekshirish kiradi: har bir belgi kiritilganda elektron pochtani tekshirish, uzunligi cheklangan maydonda qolgan belgilarni hisoblash, debounce orqali kechiktirilgan so'rov yuborish bilan qidiruvni amalga oshirish. Shuningdek, TextWatcher kiritishni formatlash uchun ham qo'llaniladi — masalan, telefon raqamida avtomatik bo'shliqlarni joylashtirish yoki sana uchun niqob qo'shish.

Android Developers ma'lumotlariga ko'ra, TextWatcher formalar bilan ishlaydigan ilovalarning 70 foizida mavjud. Material Design Components va TextInputEditText kabi kutubxonalar xato holatini boshqarish va hisoblagichlarni ko'rsatish uchun TextWatcher-dan ichki foydalanadi. Ushbu interfeysning ishlashini tushunish har bir Android dasturchisi uchun zarurdir.

TextWatcher interfeysi qanday ishlaydi

TextWatcher istalgan TextView yoki EditText obyektiga addTextChangedListener metodi orqali ulanadi. Foydalanuvchi belgi kiritganda yoki o'chirganda, Android avval beforeTextChanged, keyin onTextChanged va nihoyat afterTextChanged-ni chaqiradi. Har bir metodning parametrlarida o'zgartirilayotgan diapazon haqida ma'lumot uzatiladi: boshlang'ich pozitsiya, o'chirilgan belgilar soni va qo'shilgan belgilar soni.

Tushunish muhimki, afterTextChanged chaqirilganidan so'ng Editable obyekti allaqachon joriy qiymatni o'z ichiga oladi. Shuning uchun aynan afterTextChanged-da maydonning yakuniy matnini tekshirish qulay. Shu paytgacha ma'lumotlar hali to'liq yangilanmagan bo'ladi. Dasturchilar ko'pincha metodlarning vazifasini aralashtirib, yakuniy tekshirish uchun onTextChanged-dan foydalanadilar, holbuki to'g'ri tanlov afterTextChanged-dir.

Metodlarni chaqirish xususiyatlari

Har bir belgi kiritilishi, almashtirilishi yoki o'chirilishida chaqiruv zanjiri to'liq bajarilishi kafolatlanadi. Biroq, afterTextChanged ichida matn o'zgartirilsa (clear, append, insert orqali), TextWatcher rekursiv ishga tushadi. Bu Android formalarida StackOverflowError-ning eng keng tarqalgan sababidir. Rekursiyaning oldini olish uchun bloklash bayrog'idan foydalaniladi.

TextWatcher-ning uch metodi: beforeTextChanged, onTextChanged, afterTextChanged

Uch metodning har biri matn o'zgarishining hayotiy siklida o'z rolini o'ynaydi. beforeTextChanged(CharSequence s, int start, int count, int after) metodi o'zgarishlar qo'llanilishidan oldin chaqiriladi. U satrning joriy holatini, o'zgarishning boshlang'ich pozitsiyasini, o'chirilayotgan belgilar sonini va qo'shilayotgan belgilar sonini uzatadi. Bu yerda oldingi qiymatni saqlash yoki o'zgartirishdan oldin shartlarni tekshirish mumkin.

onTextChanged metodi o'zgarish paytida, belgilar allaqachon o'chirilgan, ammo yangilari hali kiritilmaganida chaqiriladi. Parametrlar: o'chirishdan keyingi matn, boshlang'ich pozitsiya, o'chirilgan belgilar soni va qo'shilayotgan belgilar soni. Bu metod animatsiya yoki loglash uchun qulay, ammo joriy yakuniy matn bilan ishlash uchun emas — u hali to'liq shakllanmagan.

afterTextChanged metodi eng ko'p talab qilinadiganidir. U Editable obyektini oladi va o'zgarishlar to'liq qo'llanilganidan keyin chaqiriladi. Bu metoddan maydonning yakuniy qiymatini o'qish, tekshirish o'tkazish, UI-ni yangilash va matnni o'zgartirish (rekursiya sababli ehtiyotkorlik bilan) mumkin.

Belgilarni hisoblash uchun TextWatcher tatbiqi namunasi

Amaliy namuna — matn har o'zgarganida yangilanadigan belgi hisoblagichi kiritish maydoni uchun. Bunday element ko'pincha aloqa formalarida, xabarlarda va uzunligi cheklangan postlarda uchraydi. TextWatcher orqali tatbiq bir necha qatorni oladi va uchinchi tomon kutubxonalarini talab qilmaydi.

kotlin
val editText = findViewById<EditText>(R.id.edit_text)
val counterText = findViewById<TextView>(R.id.counter)

editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(
        s: CharSequence?, start: Int,
        count: Int, after: Int
    ) {}

    override fun onTextChanged(
        s: CharSequence?, start: Int,
        before: Int, count: Int
    ) {}

    override fun afterTextChanged(s: Editable?) {
        val len = s?.length ?: 0
        counterText.text = "$len / 200"
    }
})

Misolda afterTextChanged metodi s parametri (Editable turi) orqali maydonning joriy mazmunini oladi. Matn uzunligi alohida TextView-da yangilanadi. Rekursiyaning oldini olish uchun bu holatda faqat counterText o'zgartiriladi, EditText-ning o'zi emas, shuning uchun sikl yuzaga kelmaydi. 200 belgi cheklovida haddan oshgandan keyin kiritishni bloklash mumkin.

beforeTextChanged va onTextChanged metodlari bo'sh qoladi, chunki uzunlikni hisoblash uchun yakuniy holat yetarli. Agar har bir o'zgarishni loglash kerak bo'lsa, kod onTextChanged-ga qo'shilishi mumkin. Bunday moslashuvchanlik TextWatcher-ni matn kiritish bilan ishlashning istalgan stsenariysi uchun universal vositaga aylantiradi.

Real vaqtda maydonlarni tekshirish uchun TextWatcher

Real vaqtda tekshirish UX-ni sezilarli darajada yaxshilaydi: foydalanuvchi noto'g'ri qiymat kiritgandan so'ng darhol xatoni ko'radi, yuborish tugmasini bosgandan keyin emas. TextWatcher elektron pochta, parol, telefon raqami va boshqa maydonlarni bir zumda tekshirish imkonini beradi. Natija EditText-da setError orqali yoki alohida TextView-da xato xabari bilan ko'rsatiladi.

kotlin
fun validateEmail(emailEditText: EditText) {
    emailEditText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
            val email = s?.toString () ?: ""
            if (email.isNotBlank() &&
                !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
                emailEditText.error = "Invalid email address"
            } else {
                emailEditText.error = null
            }
        }

        override fun beforeTextChanged(...) {}
        override fun onTextChanged(...) {}
    })
}

Misolda elektron pochtani tekshirish uchun Android SDK-dan o'rnatilgan Patterns.EMAIL_ADDRESS ishlatilgan. Agar matn bo'sh bo'lmasa va namunaga mos kelmasa, maydonga error xususiyati orqali xato o'rnatiladi. To'g'ri kiritilganda xato tozalanadi. Bo'sh maydonda tekshirishni ishga tushirmaslik muhim — foydalanuvchi hali kiritishni boshlamagan bo'lishi mumkin va xato xabari erta bo'ladi.

Parollar va telefon raqamlari uchun maxsus regex ifodalari yoki ixtisoslashgan kutubxonalar ishlatiladi. Masalan, parol murakkabligini tekshirish uchun raqamlar, katta va kichik harflar sonini hisoblash mumkin. TextWatcher parol murakkabligi ko'rsatkichini real vaqtda yangilash imkonini beradi, bu ro'yxatdan o'tish konversiyasiga ijobiy ta'sir ko'rsatadi.

TextWatcher bilan ishlashda odatiy xatolar

Birinchi va eng jiddiy xato — rekursiv chaqiruv. afterTextChanged ichida xuddi shu EditText matni o'zgartirilsa (s.clear(), s.append() yoki s.insert() orqali), TextWatcher qayta ishga tushadi. Bu StackOverflowError bilan tugaydigan cheksiz sikl yaratadi. Yechim — isUpdating bloklash bayrog'idan foydalanish yoki matn haqiqatan o'zgarganligini tekshirish.

Ikkinchi keng tarqalgan muammo — xotira oqishi. TextWatcher anonim sinf orqali Activity yoki Fragment-ga yashirin havolani saqlaydi. View yo'q qilinganda listener o'chirilmasa, garbage collector xotirani bo'shata olmaydi. Yechim — hayotiy sikl komponentlaridan foydalanish yoki onDestroyView-da removeTextChangedListener-ni aniq chaqirish.

Uchinchi xato — noto'g'ri metoddan foydalanish. Ba'zi dasturchilar afterTextChanged-ni kutmasdan onTextChanged-da yakuniy tekshirishni amalga oshiradilar. onTextChanged-da matn hali to'liq yangilanmagan va yakuniy qiymatni o'qish noto'g'ri ma'lumotlarni qaytarishi mumkin. To'g'ri yondashuv — yakuniy matnni o'qish va tekshirishning barcha mantiqini afterTextChanged-da joylashtirish.

MetodChaqirilish vaqtiVazifasiYakuniy matnni o'qish mumkinmi?
beforeTextChangedO'zgarishdan oldinOldingi holatni saqlashHa
onTextChangedO'zgarish paytidaLoglash, animatsiyaYo'q
afterTextChangedO'zgarishdan keyinTekshirish, hisoblash, UI yangilashHa

To'rtinchi xato — TextWatcher-ni bir necha marta qo'shish. Agar addTextChangedListener bitta EditText uchun bir necha marta chaqirilgan bo'lsa, barcha listener-lar bir xil o'zgarishni qayta ishlaydi. View-lar dinamik qo'shiladigan formalarda bu tekshirishlarning takrorlanishiga va oldindan aytib bo'lmaydigan xatti-harakatga olib keladi. Har doim listener avval qo'shilganligini tekshiring yoki yagona instansiyadan foydalaning.

Ko'p beriladigan savollar

onTextChanged afterTextChanged-dan qanday farq qiladi?

OnTextChanged matn o'zgarishi paytida chaqiriladi, yangi belgilar hali qo'shilmagan bo'ladi. Bu metod animatsiya va loglash uchun mos keladi. AfterTextChanged o'zgarishlar to'liq qo'llanilganidan keyin chaqiriladi va Editable parametri orqali yakuniy matnga kirish imkonini beradi. Tekshirish va qiymatni o'qish uchun afterTextChanged-dan foydalaning.

TextWatcher-ning rekursiv chaqiruvidan qanday qochish mumkin?

afterTextChanged ichida matnni o'zgartirishdan oldin true qiymatiga o'rnatiladigan Boolean turidagi bloklash bayrog'idan foydalaning. Metodning boshida bayroqni tekshiring: agar true bo'lsa — chiqing. Shu bilan bir qatorda, eski va yangi qiymatni solishtirib, matnni faqat haqiqiy farq bo'lganda o'zgartirishingiz mumkin.

Activity yo'q qilinganda TextWatcher-ni o'chirish kerakmi?

Ha, albatta. TextWatcher-ning anonim sinfi closure orqali Activity-ga havolani saqlaydi. Listener o'chirilmasa, Activity garbage collector tomonidan yig'ib olinmaydi. Fragment uchun onDestroyView-da, Activity uchun onDestroy-da har doim removeTextChangedListener-ni chaqiring.

TextWatcher RecyclerView-da ishlatilishi mumkinmi?

Ha, lekin ehtiyotkorlik bilan. RecyclerView-da ViewHolder-lar qayta ishlatiladi va oldingi pozitsiyadagi TextWatcher faol qolishi mumkin. onBindViewHolder metodida yangi TextWatcher o'rnatishdan oldin har doim eskisini o'chiring. Listener-ga havolani saqlash uchun tag-lardan yoki ViewHolder-ning alohida maydonlaridan foydalaning.

Avtomatik to'ldirish bilan qidiruv uchun qaysi metod eng yaxshi?

Qidiruv maydoni uchun debounce (kechikish) bilan birgalikda afterTextChanged dan foydalaning. Har bir yangi matn o'zgarishida qayta o'rnatiladigan 300-500 ms taymerni amalga oshiring. Bu har bir tugma bosilishida serverga so'rov yuborishning oldini oladi va API yukini kamaytiradi.

Xulosa

  • TextWatcher — EditText va TextView-larda matn o'zgarishlarini kuzatish uchun Android interfeysi, uchta qayta chaqiruv metodini amalga oshiradi.
  • afterTextChanged metodi — o'zgarishlardan keyin tekshirish va yakuniy matnni o'qish uchun eng maqbul tanlov.
  • Rekursiv chaqiruv — TextWatcher-ning asosiy xavfi, bloklash bayrog'i bilan oldi olinadi.
  • Listener-ni o'chirish Activity yoki Fragment yo'q qilinganda xotira oqishining oldini olish uchun majburiydir.
  • Real vaqtda tekshirish TextWatcher bilan UX-ni yaxshilaydi va xatolarni darhol ko'rsatish imkonini beradi.
  • Debounce server yukini kamaytirish uchun qidiruv va avtomatik to'ldirishni amalga oshirishda zarurdir.
  • To'g'ri metod tanlovi — barqaror ishlash kaliti: beforeTextChanged holatni saqlash uchun, onTextChanged loglar uchun, afterTextChanged yakuniy tekshirish uchun.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing