안녕하세요!
오늘은 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
}
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이 아닌지 체크하여 동작하므로
무한루프를 방지해줍니다
오늘은 여기까지 입니다! 도움되셨다면 하단에 하트 눌러주세요~
'Android' 카테고리의 다른 글
[Android] APK 빌드 오류 : Lint found fatal errors while assembling a release target. (0) | 2020.07.25 |
---|---|
[Android] Glide 라이브러리 사용하기 (ImageView에 이미지 리소스, GIF 넣기) (0) | 2020.07.14 |
[Android] Retrofit 2.0 사용 방법 (Java, Kotlin) - 2. Call 동기, 비동기 (6) | 2019.09.03 |
[Android] TextView, EditText 글자 수, 줄 수 제한하기 (+글자 줄임 표시) (0) | 2019.08.08 |
[Android] Button 클릭 효과 주기 (버튼 누르는 효과, XML) (0) | 2019.08.06 |