오늘은 EditText에서 문자 입력 시 글자가 계속 복제되었던 문제를 소개한다.
발생 배경
ID 입력을 모두 소문자로 강제해달라는 요구가 있었다.
이전에 모두 대문자로 강제해본 기억이 있었고, 그 때 사용했던 방법은 EditText.setFilters 였다.
editText.filters = arrayOf(InputFilter.AllCaps())
이런 식으로 말이다.
그래서 InputFilter를 잘 조절하면 소문자 강제도 어렵지 않겠다는 생각이 들었다.
그렇게 탄생한 코드는 아래와 같다.
editText.filters = arrayOf(InputFilter { inputText, i, i2, spanned, i3, i4 ->
inputText.toString().lowercase()
}
되게 합리적인 코드라고 생각하기도 했고
보통은 아이디 입력 속도가 그리 빠르지 않아 자체 테스트 시 검출되지 않은 문제가 있었다.
바로 제목에 써둔 글자가 EditText에 복제되는 현상이다.
특히 LG 디바이스 중에서는 몇글자만 입력해도 입력 값이 복제되어 들어갔다.
삼성 디바이스에서는 연타하듯 빠르게 입력할 때 동일한 증상을 보였다.
그래서 이제 어떻게 해결할래
setFilter를 사용하는 방법이 가장 깔끔할 것이라 생각해 계속 방법을 찾아봤지만, 다들 이 코드를 권장하지 않았다.
나와 동일한 문제를 겪었기 때문이다.
결국 돌고 돌아 TextChangedListener를 사용했다.
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun afterTextChanged(editable: Editable?) {
editable?.let {
val lowercaseText = it.toString().lowercase()
if (it.toString() != lowercaseText) {
it.replace(0, it.length, lowercaseText)
editText.setSelection(lowercaseText.length)
}
}
}
})
setSelection 코드까지 필요한 이유는 입력마다 커서를 가장 뒤로 이동시켜줘야하기 때문이다.
참조
https://stackoverflow.com/questions/10792051/edittext-and-inputfilter-cause-repeating-text
EditText and InputFilter cause repeating text
I'm trying to implement an EditText that limits input to alpha chars only [A-Za-z]. I started with the InputFilter method from this post. When I type "a%" the text disappears then if I hit backsp...
stackoverflow.com
'Android' 카테고리의 다른 글
Store Signed APK 실행 시 Play Store로 이동 (0) | 2025.02.11 |
---|---|
Android Share Image File In 2way (0) | 2025.01.01 |
Android add library using toml (0) | 2024.11.27 |
Android QR Code Generation (0) | 2024.11.26 |
Android Watchdog 기능 추가하기(OS 9) (0) | 2024.11.25 |