버그 잡이

[android] edittext 적용시 확인해야할 디테일. #editTextInputFilter 코틀린에 적용하기 본문

안드로이드

[android] edittext 적용시 확인해야할 디테일. #editTextInputFilter 코틀린에 적용하기

버그잡이 2020. 5. 1. 16:01

eidttext는 사용자의 입력을 받는 창이다.

 

단순 버튼과는 다르게 사용자의 다양한 패턴에 대한 대응을 해줘야한다.

 

 

1. 키패드의 버튼으로 최종 입력하는 경우

 

setOnEditorActionListener()를 활용하면 키패드를 통한 완료 처리에 대응할 수 있다.

*이것을 설정해주지 않으면 키패드의 완료 버튼으로 최종 결과를 입력할때 아무런 결과를 호출할 수 없다.

 

 wordMeaningET.setOnEditorActionListener { v, actionId, event ->
    if(actionId == EditorInfo.IME_ACTION_DONE){

        wordAddClick(v)

        true
    }
    else{
        false
    }
 

 

 

*imeOption이 적용이 안 되는 경우가 있다.

 

이때는 inputType="text" 을 설정해주면 된다.

그 이유는 editText가 single-line인 경우만 ime 설정이 가능하기 때문이다.

 

https://stackoverflow.com/questions/5578991/actiondone-imeoption-doesnt-work-on-edittext-in-android-2-3

 

 

 

*키패드 때문에 레이아웃이 일그러지는 경우

 

키패드 설정시 레이아웃이 변경되는 경우가 있다. 

이럴때는 manifest 또는 activity 속성에 다음과 같이 선언해주면 된다.

 

 

in Manifest

android:windowSoftInputMode="adjustNothing"

 

OR

 

 

in Kotlin Code

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)

 

 

 

 

 

2. 공백상태로 클릭하는 경우

 

TextUtils.isEmpty() 을 사용하여 예외처리를 해주자.

 

if(TextUtils.isEmpty(englishWordET.text)){
            Toast.makeText(this, R.string.toast_no_edt, Toast.LENGTH_LONG).show()
        }

 

 

 

 

3. 영어를 입력해야하는데 한글을 입력하는 경우

 

 

in XML

android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

 

위 방법은 간단하지만 결정적인 단점이 있다.

우리가 위에서 열심히 설정한 IME 설정이 동작하질 않는다... 

 

 

위 문제를 해결하기 위해서는 

 

 

inputFilter 를 사용하자.

 

  private fun onlyAlphabetFilterToEnglishET() {
        englishWordET.setFilters(arrayOf(
            InputFilter { src, start, end, dst, dstart, dend ->
                if (src == " ") { // for space
                    return@InputFilter src
                }
                if (src == "") { // for backspace
                    return@InputFilter src
                }
                if (src.matches(Regex("[a-zA-Z]+"))) {
                    return@InputFilter src
                }
                Toast.makeText(this, "영단어를 입력해주세요", Toast.LENGTH_LONG).show()
                englishWordET.setText("")
                return@InputFilter ""

            }
        ))
    }

 

 

 

 

 

 

 

 

반응형
Comments