본문 바로가기
Android/Java

[Android / Java] 보호 번호 입력창 만들기

by ghan2 2024. 6. 7.

데이터를 입력받을 때 휴대폰 번호나 비밀 번호 같은 정보는 가려서 표시해주는 것이 좋다. 

아래와 같은 화면 구현을 하고 싶었는데 번호를 가리고 해제하는 부분이 잘 안 됐다.. 로직을 이해하고 기억하자

 

처음 작성했던 코드!

 visibleButton.setOnClickListener(v -> {
            if (isPasswordVisible) {
                phonEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                visibleButton.setBackground(getResources().getDrawable(R.drawable.visible));
                isPasswordVisible = false;
            } else {
                phonEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                visibleButton.setBackground(getResources().getDrawable(R.drawable.invisible));
                isPasswordVisible = true;
            }
            phonEditText.setSelection(phoneNumberInput.getEditText().getText().length());
        });

 

당연히 될 줄 알았다..! 가려진 휴대폰 번호를 다시 보이게 하는 것 까지는 작동했지만, 다시 invisible상태로 바꾸지는 못했다.. 

 

해결

다음과 같이 코드를 수정해주니 정상작동하였다.

visibleButton.setOnClickListener(v -> {
            if (isPasswordVisible) {
                phonEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
                phonEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                visibleButton.setBackground(getResources().getDrawable(R.drawable.visible));
                isPasswordVisible = false;
            } else {
                phonEditText.setTransformationMethod(null);
                phonEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                visibleButton.setBackground(getResources().getDrawable(R.drawable.invisible));
                isPasswordVisible = true;
            }
            phonEditText.setSelection(phoneNumberInput.getEditText().getText().length());
        });

 

phonEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
phonEditText.setTransformationMethod(null);

 

안드로이드의 EditText에는 inputType을 설정하여 입력되는 텍스트의 유형을 지정할 수 있다. TYPE_TEXT_VARIATION_PASSWORD를 포함한 inputType 설정은 텍스트가 비밀번호로 입력되는지를 나타내지만, 이것만으로는 입력된 텍스트를 마스킹하여 숨기는 기능은 수행하지 않는다.

 

반면 setTransformationMethod() 메서드는 텍스트의 표시 방식을 변경하는 데 사용된다. 비밀번호를 입력하는 경우에는 PasswordTransformationMethod.getInstance()를 설정하여 입력된 텍스트를 마스킹하여 숨길 수 있다. 이 메서드를 사용하면 텍스트가 입력된 형태 그대로 화면에 표시되는 것이 아니라, 마스킹된 형태로 표시된다.

 

따라서 inputType 속성은 입력된 텍스트의 유형을 정의하고, setTransformationMethod() 메서드는 입력된 텍스트의 표시 방식을 변경하는 데 사용되므로, 두 가지를 함께 사용하여 비밀번호 입력 필드의 동작과 표시를 정의할 수 있다.