코틀린으로 작성한 안드로이드 onFocusChangeListener Event Listener 사용하기

자바 코드

item.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
            //method
        }
});

OnFocusChangeListener에 onFocusChange 메소드를 오버라이드하여 hasFocus이라는 boolean 타입의 변수로 포커스를 판단할 수 있습니다.

코틀린 코드

위 자바 코드대로 비슷하게 작성하려면

item.setOnFocusChangeListener(object :OnFocusChangeListener{
    override fun onFocusChange(v: View?, hasFocus: Boolean) {
    }
})

위와 같이 OnFocusChangeListener 타입의 object를 만들 수는 있습니다.

다만, 위와 같이 코딩을 하면 Use property access syntax라면서 프로퍼티 접근 문법을 사용하라고 경고합니다.

item.onFocusChangeListener = object :OnFocusChangeListener{
    override fun onFocusChange(v: View?, hasFocus: Boolean) {

    }
}

경고를 없애기 위해 setOnFocusChangeListener를 onFocusChangeListener으로 프로퍼티 접근 문법을 사용했습니다.

그런데 Convert to lambda라며 약한 경고가 또 발생합니다.

그래서 람다식으로 바꾸어보았습니다.

item.onFocusChangeListener = OnFocusChangeListener { v, hasFocus -> }

OnFocusChangeListener을 람다식으로 자동 변환된 모습입니다.

item.onFocusChangeListener = OnFocusChangeListener { view, hasFocus ->
    if (hasFocus){
        //method
    } 
}

자동 변환된 람다식에 포커스에 따른 변화를 주기 위해서 조건문을 추가하면 위와 같은 예제 코드가 됩니다.

최종적으로 작성된 예제코드를 보면, 자바에서는 익명 객체를 전달하는데에 그쳤지만 코틀린에서는 코틀린스럽게 처리할 수 있습니다.

Written on August 16, 2018