단비의 개발블로그

[Android] TextWatcher 사용하기 - EditText 입력 변경 이벤트 탐지 (Kotlin) + 무한루프 해결법 본문

Android

[Android] TextWatcher 사용하기 - EditText 입력 변경 이벤트 탐지 (Kotlin) + 무한루프 해결법

단비냥 2019. 9. 8. 22:15
반응형

안녕하세요!

오늘은 EditText를 사용하다보면 쓸 일이 생기는 TextWatcher에 대해 포스팅 해보겠습니다.

TextWatcher는 단어 그대로 입력되는 Text를 감지하고 있다가 실시간으로 동작하는 유용한 클래스죠.

입력 값 형식 체크, 환율 계산 등등 여러 상황에서 많이 쓰입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private val textWatcher = object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
            val length = s.toString().length
            tvLength.text = "$length / 120"
        }
 
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
 
        }
 
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
 
        }
}
r
 

textWatcher 변수에 선언해주고,

1
editText.addTextChangedListener(textWatcher)
 

적용은 이렇게 해주세요!

 

afterTextChanged 메서드는 텍스트가 변경된 이후에 동작합니다.

위의 코드는 editText에 입력된 텍스트 길이를 인식하여 실시간으로 TextView에 표시해줍니다.

 

beforeTextChanged텍스트가 변경되기 바로 이전에 동작하고,

onTextChanged텍스트가 변경되는 동시에 동작합니다. 

 

 

+ 추가) Timer 사용

TextWatcher를 사용하면 어떤 메서드를 사용하더라도 텍스트를 입력하는 거의 동시에 동작하기 때문에,

시간 텀을 주고 싶을 때가 있습니다.

그럴 때는 Timer를 사용하면 됩니다.

 
1
2
3
4
5
6
7
8
9
10
override fun afterTextChanged(s: Editable?) {
     val timer = Timer()
     timer.schedule(object : TimerTask() {
         override fun run() {
              runOnUiThread {
                              
              }
          }
     }, 1000)
}
 

 

이런식으로 작성해주시면 됩니다. 코드가 UI를 변경시킨다면 상황에 따라서 runOnUiThread 안에 작성해주셔야 합니다.

뒤에 숫자는 밀리초로 써주시면 됩니다. 1000 = 1초 입니다

 

 

+ 추가) 무한루프 해결법

만약 TextWatcher 코드 안에서 다른 EditText를 변경시키는 경우, 

그 EditText도 TextWatcher를 달고 있을 때는 무한루프가 발생하게됩니다.

이 경우 코드가 무한으로 계속 돌아가면서 앱이 꺼지게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 방법 1
override fun afterTextChanged(s: Editable?) {
    et2.removeTextChangedListener(textWatcher)
    // et2 변경 코드
    et2.addTextChangedListener(textWatcher)
}
 
// 방법 2
 
override fun afterTextChanged(s: Editable?) {
    if(s != null && !s.toString().equals("")){                
         
     }
}
 
0r
 

 

방법 1.

et2를 변경하기 전에 textChangedListener를 제거하고, 

et2를 변경하고 나서 다시 추가해줍니다

 

방법 2.

TextWatcher로 들어오는 string 이 null이 아닌지 체크하여 동작하므로

무한루프를 방지해줍니다

 

오늘은 여기까지 입니다! 도움되셨다면 하단에 하트 눌러주세요~

반응형
Comments