일반적으로 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 클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾거나 전체 일치 여부 등을 판별하기 위해 사용된다.
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"/>