TextWatcher 와 정규식

박재원·2024년 1월 22일
0

TIL

목록 보기
33/50
post-thumbnail

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.

// 이메일 EditText TextWatcher
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 {
	// 유효성 검사 결과 이메일 형식이 아니면 EditText 테두리를 빨간색으로 처리한다.
		binding.emailArea.setBackgroundResource(R.drawable.background_radius_red)
		return false
	}
}
// 비밀번호 EditText TextWatcher
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()
	// 영어, 숫자, 특수문자, 글자 수는 8~16자인 비밀번호 패턴
	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 {
   		// 유효성 검사 결과 비밀번호 형식이 아니면 EditText 테두리를 빨간색으로 처리한다. 
		binding.pwdArea.setBackgroundResource(R.drawable.background_radius_red)
		return false
	}
}

0개의 댓글