TIL231215 D20 정규식, addTextChangedListener

jericho·2023년 12월 15일

TIL

목록 보기
20/62

추가과제를 하느라 정신차려보니 지나가있던 하루였다.
먼저 포커스 아웃, 실시간 입력을 하나의 함수로 몰아넣고 자잘한 것들을 손본 뒤, 비밀번호 입력 처리에 매달렸다. 그런데 이것만 하는데도 하루가 다 지나가버렸다니... 믿기지 않는다. 기능 자체가 어렵다고는 할 수 없지만, 안드로이드 스튜디오나 함수의 동작에 관해 시행착오를 겪고 공부를 하면서 하다보니 이렇게 된 것 같다. 오늘 건드린 부분들에 대해 제대로 정리하려면 TIL이 아니라 각각 포스팅을 열심히 해야할 내용들인데, 다음주 월요일까지인 추가과제를 오늘도 채 못끝냈으니, 주말을 반납해야 할 판이라 정리는 나중으로 미루겠다.

정규식

비밀번호나 주소 등 입력 문자열에 대해 어떤 종류의 문자들이 들어왔는지, 포맷에 맞는지 체크하는 것이다.
대충 다음과 같이 사용했다. ($ 기호는 그냥 집어넣었는데 저렇게 고쳐졌다.)

// 전역
val pwInputRegex = """^[0-9a-zA-Z!"#${'$'}%&'()*+,-./:;<=>?@[₩]^_`{|}~]*$"""
val pwInputPattern = Pattern.compile(pwInputRegex)

// 검증
if (!pwInputPattern.matcher(pw).matches())  // body

addTextChangedListener, TextWatcher

에딧텍스트 등에서 setOnKeyListener를 하면 키보드 입력을 받지, 터치키보드는 인식하지 않음. (키보드 입력도 한 입력에 호출이 2번씩 되는 등 동작이 어떻게 이루어지는지 명확하지 않음)
addTextChangedListener를 사용해야 한다.
그리고 이 메서드는 TextWatcher를 인자로 받는다. 무명 오브젝트로 상속받아 만들 수도 있고, 그냥 와처 대신 중괄호 열어서 식 그냥 써도 되는데 판정이 after 보다도 나중인 느낌?이다.
대충 다음과 같이 사용했다.

// 액티비티 클래스에서
private val watcher by lazy {
    object : TextWatcher {
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            Log.d("mine", "before: ${etPw.selectionStart}, ${etPw.selectionEnd}")
            posCursor = etPw.selectionStart
        }

        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            Log.d(
                "mine",
                "on: ${p0}/ $p1, $p2, $p3 / ${etPw.selectionStart}, ${etPw.selectionEnd}"
            )
        }

        override fun afterTextChanged(p0: Editable?) {
            Log.d("mine", "after: ${etPw.selectionStart}, ${etPw.selectionEnd}")
            check(etPw)
            Log.d("mine", "== back from check ==")
        }
    }
}

// onCreate
etPw.addTextChangedListener(watcher)

// 무한루프 회피
etPw.removeTextChangedListener(watcher)
etPw.setText(password)
etPw.addTextChangedListener(watcher)
etPw.setSelection(posCursor)

무한루프 회피 등 고생을 했는데 InputFilter를 쓰면 된다는 것 같다. 뻘짓을 한참 하고 있었던 것 같다.

0개의 댓글