라떼는말이야
[Android] inputType에 따른 InputFilter 동작 차이: 같은 로직에 그렇지 못한 동작 본문
문제 설명
위 코드는 아이디, 비밀번호 입력 창에 필터를 적용해 입력받고자 하는 문자만 받는 기능을 한다.
코드 상으로 보면 아이디와 패스워드가 완전히 동일한 로직을 가지고 있다.
그러나 실행 결과를 보면
아이디의 경우 허용되지 않은 문자 입력 시 전체가 지워져버리고,
패스워드의 경우 허용되지 않은 문자 입력 시 입력을 무시하는 동작을 한다.
같은 로직에 다른 현상이 나타나는 것.
원인 파악
로그를 찍어보면
아이디의 source에는 아이디 입력 창에 입력한 전체 문자가 들어있었고,
패스워드의 source에는 패스워드 입력 창에 마지막으로 입력된 문자가 들어있었다.
왜 그럴까?
아이디를 입력하는 과정에서는 키보드 위에 입력한 문자들이 보이는 것을 알 수 있고,
패스워드는 그렇지 않았다.
xml에서
아이디의 inputType은 "text"
패스워드의 inputType은 "textPassword"로 지정했다.
혹시나 해서 아이디의 inputType을 "textVisiblePassword"로 지정하고 동작시켜봤다.
그랬더니 비밀번호와 동일하게 입력이 무시되는 동작을 했다.
결론
그렇다면 EditText의 inputType에 따라 InputFilter의 source로 넘어가는 값에 차이가 생긴다는 결론을 내렸다.
해결 방법
해결 방법은 여러 가지가 있을 것이다.
1. 아이디의 inputType을 "textVisiblePassword"로 (비추천)
이 방법은 추천하지 않는다. inputType은 목적에 맞게 설정되어야 한다.
2. InputFilter를 사용하지 않고 TextWatcher 사용하기
TextWatcher는 EditText에 값이 입력되기 전, 입력 중, 입력 후를 관찰할 수 있다.
그래서 입력이 완료되면 허용되지 않는 문자가 입력됐을 때는 필터링해주면 되는 것이다.
3. inputType에 맞게 InputFilter 사용하기
내가 선택한 방법이다.
EditText의 inputType이 "text"인 경우 source에 전체 문자가 담긴 다는 사실을 알았다.
이때 허용되지 않는 문자가 입력되면 source에서 해당 문자만 날려버리면 된다.
아래와 같이 말이다.
정상 동작
'안드로이드' 카테고리의 다른 글
[android] DataBinding Error - "if getId is called on an expression, it should have an id" (0) | 2022.03.15 |
---|---|
[Android] 로그인과 메인 액티비티 플로우 (with NoDisplay theme) (0) | 2022.01.19 |
[Android] 상태 바(Status Bar), 기본 배경 색상 변경하기 (0) | 2022.01.19 |
[Android] 비밀번호 정규식으로 제한하기 (password regex) (0) | 2022.01.16 |
[Android] Toast 하나만 띄우기 (Toast 취소하기) (0) | 2022.01.15 |
[안드로이드 스튜디오] Login Activity 템플릿 살펴보기 (0) | 2022.01.11 |
[Android] 실습으로 알아보는 프래그먼트 생명주기 : Android fragment lifecycle (0) | 2021.12.10 |
[Android] 실습으로 알아보는 액티비티 생명주기 : Android activity lifecycle (0) | 2021.12.09 |