ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] PhoneNumberFormattingTextWatcher 적용 안되는 이유
    Programming/Android 2021. 10. 22. 11:03

    안드로이드 기본 키보드를 사용하지 않고

    별도로 구현한 숫자 패드 UI 로 전화번호를 입력받아야 했다.

     

    버튼을 통해 숫자가 입력되면 자동으로 전화번호 포멧에 맞게 변경해줘야 했는데

    Android에서 제공해주는 PhoneNumberFormattingTextWatcher을 적용하기로 했다

     

        fun pressedNumberPad(btnId: Int) {
        	val inputText = edit_phone_num.text
            val addStr = when (btnId) {
                R.id.btn_1 -> "1"
                R.id.btn_2 -> "2"
                R.id.btn_3 -> "3"
                R.id.btn_4 -> "4"
                R.id.btn_5 -> "5"
                R.id.btn_6 -> "6"
                R.id.btn_7 -> "7"
                R.id.btn_8 -> "8"
                R.id.btn_9 -> "9"
                R.id.btn_0 -> "0"
                else -> ""
            }
            
            edit_phone_num.text = edit_phone_num.text.append(addStr)
        }

     

    처음에 버튼이 눌리면 기존에 입력되었던 숫자열 뒤에

    신규 입력된 숫자를 붙여서 setText를 하는 식으로 구현 했는데

     

    결과는 다음과 같았다.

    입력 > 01012341234
    출력 > 010-12341234

     

    첫 대쉬만 들어가고 그 이후로는 포멧 적용이 되지 않았다.

    반면 직접 EditText에 입력했을 때는 정상적인 결과가 나왔다.

    둘의 차이가 뭔지 PhoneNumberFormattingTextWatcher 에 로그를 남겨보았다

     

    먼저 숫자 패드 UI로 setText를 계속해서 해주었을 때의 로그

     

    2021-10-22 10:28:09.913 9492-9492/com.--.--- D/EDIT_TEXT_TEST: [before] : 0101
    2021-10-22 10:28:09.915 9492-9492/com.--.--- D/EDIT_TEXT_TEST: [now] : 010-1
    2021-10-22 10:28:09.915 9492-9492/com.--.--- D/EDIT_TEXT_TEST: [done] : 010-1
    2021-10-22 10:28:09.917 9492-9492/com.--.--- D/EDIT_TEXT_TEST: [done] : 010-1
    
    
    
    2021-10-22 10:40:31.318 10306-10306/com.--.--- D/EDIT_TEXT_TEST: [before] : 010-12341
    2021-10-22 10:40:31.319 10306-10306/com.--.--- D/EDIT_TEXT_TEST: [now] : 010-12341
    2021-10-22 10:40:31.319 10306-10306/com.--.--- D/EDIT_TEXT_TEST: [done] : 010-12341

     

    before -> beforeTextChanged
    now -> onTextChanged
    done -> afterTextChanged

     

    이 로그를 보면서 숫자 포멧이 적용되려면

    afterTextChanged가 두 번씩 실행되어야 한다는걸 짐작할 수 있었다.

     

     

    그 다음 실제로 EditText에 안드로이드 기본 키보드로 입력했을 때의 로그이다

     

    2021-10-22 10:44:33.831 10306-10306/com.---..---. D/text_text: [now] : 01012
    2021-10-22 10:44:33.834 10306-10306/com.---.---. D/text_text: [before] : 01012
    2021-10-22 10:44:33.835 10306-10306/com.---.---. D/text_text: [now] : 010-12
    2021-10-22 10:44:33.835 10306-10306/com.---.---. D/text_text: [done] : 010-12
    2021-10-22 10:44:33.836 10306-10306/com..---.---. D/text_text: [done] : 010-12
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [before] : 010-12
    
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [now] : 010-12345
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [before] : 010-12345
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [now] : 010-1234-5
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [done] : 010-1234-5
    2021-10-22 10:44:34.714 10306-10306/com..---.---. D/text_text: [done] : 010-1234-5

     

    역시 afterTextChanged가 두 번씩 실행되고 있었다.

     

     

    왜 버튼으로 입력했을 경우에 포멧팅이 되지 않았을까 생각해보다가

    입력 > 12345678901
    출력 > 12345678901

    PhoneNumberFormattingTextWatcher는 입력한 숫자가 전화번호 양식과 맞지 않으면

    포멧팅을 진행하지 않았던 것이 떠올랐다

     

     

    직접 구현한 숫자 패트가 터치 될때마다 setText하는 과정에서

    대쉬가 들어간 숫자열을 비정상적인 전화번호 양식으로 인식하여

    포멧이 적용되지 않았던 것이라고 예상해볼 수 있었다.

     

    나는 실제 키보드처럼 끊김없이 숫자를 입력하고 있다고 착각했지만 

    사실은 숫자 버튼을 하나하나 누를 떄마다

    새로운 텍스트가 생성되는 셈이었다.

     

    0101 -> 010-1

    그래서 첫번째는 숫자만 있는 문자열이었기에 포멧팅에 성공했지만

    그 이후로는 - 가 포함된 문자열로 인식되어 포멧팅에 실패했던 것 같다.

     

    문제를 확인하고 코드를 다음과 같이 변경하였다.

     

     fun pressedNumberPad(btnId: Int) {
            val addStr = when (btnId) {
                R.id.btn_1 -> "1"
                R.id.btn_2 -> "2"
                R.id.btn_3 -> "3"
                R.id.btn_4 -> "4"
                R.id.btn_5 -> "5"
                R.id.btn_6 -> "6"
                R.id.btn_7 -> "7"
                R.id.btn_8 -> "8"
                R.id.btn_9 -> "9"
                R.id.btn_0 -> "0"
                else -> ""
            }
            edit_phone_num.append(addStr)
        }

     

    굳이 기존 text를 받아와 다시 setText하는 과정 없이

    바로 editText에 append 해주었고

    결과도 제대로 나왔다.

     

    너무나 간단하고 쉽게 해결될 문제였는데

    ...삽질 열심히 했다

     

     

Designed by Tistory.