간단히 말해, 함수가 하나만 존재하는 인터페이스를 의미.
인터페이스 내의 함수가 단 하나 이기 때문에, 인터페이스 구현 == 해당 함수의 구현 이다.
따라서, 인터페이스 내의 함수를 구현할 때 람다식으로 구현 할 수 있다.
ㅤ
장점 : 가독성이 좋고 코드를 깔끔하게 쓸 수 있음.
자세한 사용법은 여기를 참고
우리가 정말 자주 쓰는 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 어떤 행동을 하고 싶다고 해보자.