안드로이드를 하다 보면 EditText의 값이 변경되었을 때 이벤트를 추가하고 싶은 경우가 있습니다.
이때 edittext의 addTextChangedListner를 사용하면 됩니다.
addTextChangedListner
val editText = findViewById<EditText>(R.id.edittext)
editText.addTextChangedListener(object : TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
TODO("Not yet implemented")
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
TODO("Not yet implemented")
}
override fun afterTextChanged(p0: Editable?) {
TODO("Not yet implemented")
}
})
보시다시피 addTextChangedListener는 TextWatcher를 파라미터로 받습니다.
EditText의 텍스트 변경과 관련된 세 가지 상태에 대해서 이벤트를 정의할 수 있습니다.
- beforeTextChanged(CharSequence s, int start, int count, int after): 텍스트가 바뀌기 전 이벤트
- 문자가 새 텍스트로 대체될 것임을 알리기 위한 메서드
- onTextChanged(CharSequence s, int start, int before, int count) : 텍스트가 바뀌었을 때 이벤트
- 새로운 텍스트가 이전 텍스트를 방금 대체했을 때 로출되는 메서드
- afterTextChanged(Editable s) : 텍스트가 바뀌고 난 뒤 이벤트
로그캣으로 텍스트가 변경되었을 때 메서드가 어떻게 호출되는지 알아보았습니다.
editText.addTextChangedListener(object : TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
Log.d("mytag", "바뀌기 전")
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
Log.d("mytag", "바뀌었을 때")
}
override fun afterTextChanged(p0: Editable?) {
Log.d("mytag", "바뀌고 나서")
}
})
세 개의 메서드가 값이 바뀔 때 순차적으로 실행됩니다.
TextWatcher와 TextWatcherAdapter
TextWatcher는 인터페이스이기 때문에 afterTextChanged, beforeTextChanged, onTextChanged 를 모두 구현해야 합니다.
하지만 TextWatcherAdapter를 사용하여 세 개의 메서드를 모두 구현하지 않고
원하는 메서드만 override해서 사용할 수 있습니다.
editText.addTextChangedListener(@SuppressLint("RestrictedApi")
object : TextWatcherAdapter() {
override fun onTextChanged(s: CharSequence, p1: Int, p2: Int, p3: Int) {
Log.d("mytag", "텍스트 변경")
}
})
저는 beforeTextChanged와 afterTextChanged는 사용하지 않을 것이기 때문에 TextWatcherAdapter 추상 클래스로 onTextChanged만 사용하여 이벤트를 정의했습니다.
본 글은 아래 문서를 참고하여 작성하였습니다.
https://developer.android.com/reference/android/text/TextWatcher