IDE/Android Studio

[AndroidStudio][Kotlin] EditText의 addTextChangedListener, TextWatcher, TextWatcherAdapter

  • -

안드로이드를 하다 보면 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

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.