TextWatcher
- EditText의 값이 변경될 때마다 값을 실시간으로 관찰하면서 특정 작업을 처리 해주기 위한 인터페이스이다.
beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
- 텍스트가 변경되기 전에 호출된다.
- charSequence: 현재 EditText에 입력된 값
onTextChanged(CharSequence charSequence, int i, int i1, int i2)
- 텍스트가 변경될 때마다 호출된다.
- charSequence: 새로 입력한 문자열이 추가 된 EditText값
afterTextChanged(Editable editable)
정규 표현식
- 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어이다.
- 전화번호, 주민번호, 이메일 등 사용자가 정해진 형식대로 입력했는지 검증해야 할 경우 정규 표현식을 사용한다.
정규 표현식
숫자 : ^[0-9]*$
영문자 : ^[a-zA-Z]*$
한글 : ^[가-힣]*$
이메일 : \w+@\w+\.\w+(\.\w+)?
전화번호 : ^\d{2,3}-\d{3,4}-\d{4}$
휴대전화번호 : ^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$
주민등록번호 : \d{6} - [1-4]\d{6}
우편번호 : ^\d{3}-\d{2}$
Code e.g.
binding.emailArea.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) {
isRegularEmail()
}
override fun afterTextChanged(p0: Editable?) {
}
})
private fun isRegularEmail(): Boolean {
val email = binding.emailArea.text.toString().trim()
val pattern = android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()
if (pattern) {
binding.emailArea.setBackgroundResource(R.drawable.background_radius)
return true
} else {
binding.emailArea.setBackgroundResource(R.drawable.background_radius_red)
return false
}
}
binding.pwdArea.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) {
isRegularPwd()
}
override fun afterTextChanged(p0: Editable?) {
}
})
private fun isRegularPwd(): Boolean {
val pwd = binding.pwdArea.text.toString().trim()
val pwdPattern =
"^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[$@$!%*#?&.])[A-Za-z[0-9]$@$!%*#?&.]{8,16}$"
val pattern = Pattern.matches(pwdPattern, pwd)
if (pattern) {
binding.pwdArea.setBackgroundResource(R.drawable.background_radius)
return true
} else {
binding.pwdArea.setBackgroundResource(R.drawable.background_radius_red)
return false
}
}