함수형 인터페이스를 이용해 이벤트를 처리하기

나고수·2022년 8월 28일
0

1일1공부

목록 보기
59/68
post-custom-banner

함수형 인터페이스란 ?

간단히 말해, 함수가 하나만 존재하는 인터페이스를 의미.
인터페이스 내의 함수가 단 하나 이기 때문에, 인터페이스 구현 == 해당 함수의 구현 이다.
따라서, 인터페이스 내의 함수를 구현할 때 람다식으로 구현 할 수 있다.

장점 : 가독성이 좋고 코드를 깔끔하게 쓸 수 있음.
자세한 사용법은 여기를 참고

함수형 인터페이스를 이용해 이벤트 처리하기

우리가 정말 자주 쓰는 setOnClickListener처럼 함수형 인터페이스를 이용해 이벤트를 처리해보자.

상황 : MainActivity 안에 CoordinateLayout으로 감싸진 Viewpager가 있다.
CoordinateLayout의 상태가 달라 질 때마다 viewpager 내의 fragment을 새로 세팅하고 싶었음.
상황이 좀 복잡하긴 한데, 일단 함수형 인터페이스로 어떻게 이벤트를 처리하는지에 집중해보자!

//MainActivity.kt

  var mOnsetCollapsingChangeListener: OnsetCollapsingChangeListener? = null

    private fun setCollapsingListener() {
        binding.appbarCalendar.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
            override fun onStateChanged(appBarLayout: AppBarLayout?, state: State?) {
                if (state == State.COLLAPSED) {
                    mOnsetCollapsingChangeListener?.setOnCollapsingChange(true)
                } 
                //실제 작동 하는 부분. 
                //mOnsetCollapsingChangeListener에는 MainFragment에서 구현한 리스너가 들어가 있으므로
                //MainFragment에서 구현한 핸들러
                //-액티비티의 coordinateLayout의 동작 변화에 따라 fragment에서 변화시킬 내용이 실행됨-가 작동한다. 
                
                if (state == State.EXPANDED) {
                    mOnsetCollapsingChangeListener?.setOnCollapsingChange(false)
                }
            }
        })
    }
   
  //함수형 인터페이스를 만든다.
  fun interface OnsetCollapsingChangeListener { //인터페이스를 리스너
        fun setOnCollapsingChange(boolean: Boolean)  //실제 작동하는 함수를 핸들러 라고 부른다.
    }
 
  //미리 만들어놓은 'mOnsetCollapsingChangeListener'에 (MainFragment에서 구현할) 
 //핸들러가 구현되어 있는 리스너 객체를 넣는다. 
  fun setOnCollapsingChangeListener(listener: OnsetCollapsingChangeListener) {
        mOnsetCollapsingChangeListener = listener
    }
//MainAFragment.kt
//방법 1.

//함수형 인터페이스를 상속받는다.
class MainAFragment : Fragment(),MainActivity.OnsetCollapsingChangeListener {

     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (requireActivity() as CalendarActivity).setOnCollapsingChangeListener(this) // 리스너 등록
    }

//핸들러 구현 
 override fun setOnCollapsingChange(isCollapsed: Boolean) {
        if (isCollapsed) {

        } else {
   
        }
    }
    
//방법2,3.
//함수형 인터페이스는 상속받지 않고

//익명함수로 넣어준다.
  (requireActivity() as CalendarActivity).setOnCollapsingChangeListener(object : CalendarActivity.OnsetCollapsingChangeListener{
            override fun setOnCollapsingChange(isCollapsed: Boolean) {
                if(isCollapsed){}
                else{}
            }
        })

//함수형 인터페이스는 맨처음에 말했다시피 바로 람다로 구현 가능하다. 
(requireActivity() as CalendarActivity).setOnCollapsingChangeListener{ isCollapsed ->
            if(isCollapsed){}
            else{}
        }

정리

정리는 좀 쉬운 버전으로, CustomView에서 버튼을 누르면 MainActivity 어떤 행동을 하고 싶다고 해보자.

profile
되고싶다
post-custom-banner

0개의 댓글