EditText가 포함된 Activity에 진입 시 키보드가 자동으로 올라오는 문제가 발생하고 있다면 다음 속성값을 추가해주면 된다.

EditText에 focust가 있어서 키보드가 올라오기 때문에 포커스를 제거하던가 아래 속성값을 넣어주면 된다.

 

방법1

부모 뷰에 포커스를 주는 방식으로 xml에서 부모뷰에 다음 속성값을 추가한다.

android:focusable="true"
android:focusableInTouchMode="true"

 

방법2

manifest의 해당 activity에 windowSoftInputMode="stateAlwaysHidden"값을 추가한다

<activity
    android:name=".SampleActivity"
    android:exported="false"
    android:windowSoftInputMode="stateAlwaysHidden"
    android:screenOrientation="nosensor">
</activity>

stateAlwaysHidden -> 액티비티가 시작될 때 항상 키보드를 숨기게 하는 속성

EditText를 입력하고 키보드창을 닫은 후 다시 editText를 클릭하게 되면 커서가 맨 앞으로 이동하는 경우가 생기는데 

그런 경우에 사용자가 잘못 입력해서 텍스트를 지우려고 하면 커서를 움직여야 하는 불편함이 따른다.

이 때 EditText를 눌렀을 때 커서를 맨 끝으로 이동하려면 setSelection을 사용하면 된다. 

 

binding.editText.setSelection(binding.editText.text.length)

EditText에 실시간으로 입력된 값에따라 특정 이벤트를 발생시키거나 뷰를 보이게해야 할 때가 있다.

그런경우 TextWatcher라는 Interface를 사용하여 EditText에 실시간으로 입력된 값을 받아 올 수 있다.

 

editText.addTextChangedListener(object : TextWatcher {
            override fun **afterTextChanged**(s: Editable?) {
                // text가 변경된 후 호출
                // s에는 변경 후의 문자열이 담겨 있다.
            }

            override fun **beforeTextChanged**(s: CharSequence?, start: Int, count: Int, after: Int) {
                // text가 변경되기 전 호출
                // s에는 변경 전 문자열이 담겨 있다.
            }

            override fun **onTextChanged**(s: CharSequence?, start: Int, before: Int, count: Int) {
                // text가 바뀔 때마다 호출된다. 
                checkEmail()
            }
        })

 

afterTextChanged(s : Editable?) {}

  • Text가 변경된 후 호출, s→ 변경후의 문자열

beforeTextChanged(s : CharSequence?, start: Int, count: Int, after: Int )

  • Text변경 전 호출 s → 변경전의 문자열
  • start : s에 저장된 문자열에서 새로 추가될 문자열의 시작 위치값(인덱스)
  • count : s에 새로운 문자열이 추가된 후 문자열의 길이
  • after: 새로 추가될 문자열의 길이

onTextChanged(s : CharSequence?, start: Int, before: Int, count: Int)

  • Text실시간 호출 s → 실시간으로 변경되는 문자열
  • start : 새로 추가된 문자열의 시작 위치 값
  • befoer : 삭제된 기존 문자열의 개수
  • count : 새로 추가된 문자열의 개수
  1. 숫자만 : ^[0-9]*$
  2. 영문자만 : ^[a-zA-Z]*$
  3. 한글만 : ^[가-힣]*$
  4. 영어 & 숫자만 : ^[a-zA-Z0-9]*$
  5. E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
  6. 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
  7. 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$
  8. 주민등록번호 : \d{6} \- [1-4]\d{6}
  9. IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

- 연도(year) 유효성 검사

fun isValidYear(year: String) : Boolean {

    //1900~1999,20xx
    val regex = "^(19[0-9][0-9]|20\\\\d{2})$".toRegex()

    return regex.matches(year)
}

 

- 월(month) 유효성 검사

fun isValidMonth(month: String) : Boolean {

    var regex = "^0[1-9]|1[0-2]|[1-9]$".toRegex()

    return regex.matches(month)
}

 

- 일(day) 유효성 검사 (2월 31일이 입력되는 문제가 있기 때문에 따로 처리 해줘야함)

fun isValidDay(day: String) : Boolean {

    var regex = "^0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9]$".toRegex()

    return regex.matches(day)
}

 

- 숫자 유효성 검사

fun isValidNumber(phonNumber: String) : Boolean {

    val regex = "^[0-9]+$".toRegex()

    return regex.matches(phonNumber)
}

 

 

- 10자리 or 11자리 유효성 검사

fun isValidPhone(phonNumber: String) : Boolean {

    val regex = "^(?:\\\\d{10}|\\\\d{11})$".toRegex()

    return regex.matches(phonNumber)
}

+ Recent posts