안드로이드 EditText 영문, 숫자, 특수문자만 입력 - 한글 입력 제한하기, 한글 포함 여부 확인하기 (feat. 특정 문자만 입력 허용하기)

임현주·2022년 3월 31일
0
post-thumbnail

일반적으로 id에는 한글을 포함할 수 없는 법.. 어떤 방법으로 제한할지 고민하다가 보통 APP들의 경우 포스팅 제목과 같이 두 가지 경우를 적용시키고 있었다. 그래서 일단은 두 가지 경우 다 적용시켜보기로 했다 🙋🏻‍♀️ !!

🎈 한글 포함 여부 확인하기

입력하는 동안은 한글이 허용되지만 형식이 잘못되었다는 알림을 띄우거나, 다음 버튼을 비활성화하는 등의 예외처리를 한다. 이 방법은 정규식을 이용하면 된다. 아래 코드는 텍스트 변경을 감지하다가 한글을 포함하면 다음 버튼을 비활성화하는 예시이다.

'onMyTextChanged' 라는 EditText 확장 함수를 선언해 텍스트 변경 감지한다.

Extensions.kt

fun EditText.onMyTextChanged(completion: (Editable?) -> Unit) {
    this.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
        
        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
        
        override fun afterTextChanged(editable: Editable?) {
            completion(editable)
        }
    })
}

👩🏻‍🏫 미리 알고 가자 !

Pattern : 정규 표현식이 컴파일 된 클래스. 정규 표현식에 대상 문자열을 검증하거나 활용하기 위해 사용되는 클래스다.
Matcher : Pattern 클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾거나 전체 일치 여부 등을 판별하기 위해 사용된다.

  1. Pattern.compile() : 주어진 정규식을 갖는 패턴을 생성한다.
  2. matcher() : 패턴에 매칭할 문자열(onMyTextChanged로 반환받은 문자)을 입력해 Matcher를 생성한다.
  3. find() : 패턴이 일치하는 문자열을 찾아 Boolean값을 반환한다. (있으면 true, 없으면 fasle 반환)
JoinIdFragment.kt

private fun initView() {
    binding.idEditText.onMyTextChanged {
        val pattern = Pattern.compile(HANGUL_PATTERN)
        val matcher = pattern.matcher(it.toString())
        // if문을 통해 예외처리를 해도 되겠지용 :)
        binding.nextButton.isEnabled = !(matcher.find())
    }
}

companion object {
    const val HANGUL_PATTERN = ".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*"
}

🎈 한글 입력 제한하기

처음부터 영어, 숫자만 입력을 허용한다. 이 방법은 민망할 정도로 간단하다..! 코틀린 코드까지 갈 필요도 없이 xml에서 EditText 속성 설정으로 끝내버린다..⭐

digits는 입력 가능한 문자 타입을 제한하는 속성이다. 휴대폰번호에 숫자와 하이픈만 받고 싶다면 android:digits="0123456789-" 이런식으로 추가하면 된다. 나의 경우 언더바도 추가하면 좋을 것 같아서 아래와 같이 적용시켰다.

fragment_join_id.xml

<EditText
    android:id="@+id/idEditText"
    android:maxLines="1"
    android:digits="0123456789_qwertzuiopasdfghjklyxcvbnm"/>
profile
🐰 피드백은 언제나 환영합니다

0개의 댓글