라떼는말이야

[Android] inputType에 따른 InputFilter 동작 차이: 같은 로직에 그렇지 못한 동작 본문

안드로이드

[Android] inputType에 따른 InputFilter 동작 차이: 같은 로직에 그렇지 못한 동작

MangBaam 2022. 1. 16. 01:39
반응형

문제 설명

위 코드는 아이디, 비밀번호 입력 창에 필터를 적용해 입력받고자 하는 문자만 받는 기능을 한다.

코드 상으로 보면 아이디와 패스워드가 완전히 동일한 로직을 가지고 있다.

 

그러나 실행 결과를 보면

다르게 동작하는 모습

아이디의 경우 허용되지 않은 문자 입력 시 전체가 지워져버리고,

패스워드의 경우 허용되지 않은 문자 입력 시 입력을 무시하는 동작을 한다.

같은 로직에 다른 현상이 나타나는 것.

 

원인 파악

로그를 찍어보면

아이디의 source에는 아이디 입력 창에 입력한 전체 문자가 들어있었고,

패스워드의 source에는 패스워드 입력 창에 마지막으로 입력된 문자가 들어있었다.

 

왜 그럴까?

 

아이디와 패스워드 입력창 비교

아이디를 입력하는 과정에서는 키보드 위에 입력한 문자들이 보이는 것을 알 수 있고,

패스워드는 그렇지 않았다.

 

서로 다른 inputType

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에서 해당 문자만 날려버리면 된다.

아래와 같이 말이다.

 

정상 동작

정상 동작

반응형
Comments