[ kotlin ] Fragment 통신 - 인터페이스 방식

·2023년 12월 8일
0

Mobile-Software

목록 보기
4/15
post-thumbnail

Fragment 통신

인터페이스 방식

Fragment 간 통신은 Fragment 끼리 직접 통신할 수 없다
hosting Activity 를 거쳐 이루워진다.

  1. FragmentA 가 인터페이스(MyListener) 정의
    추상 메소드(onMethodA) 선언
    FragmentA 의 뷰에 이벤트 발생
    Hosting
  2. FragmentB 가 FragmentA 가 요구하는 기능을 메소드(methodB)로 구현
  3. Hoisting Activity 는 FragmentA 가 정의한 인터페이스 상속
    추상메소드 구현
    FragmentB 의 메소드(methodB()) 호출





  1. FragmentA 가 인터페이스(MyListener) 정의
class FragmentA : Fragment() {
    interface ButtonListener {
        fun onButtonClick()
    }



  • onAttach 메서드 : Fragment가 Activity에 연결될 때 호출되며, 이때 ButtonListener 인터페이스를 구현한 Activity와의 연결을 설정합니다. 만약 Activity가 이 인터페이스를 구현하지 않았다면 ClassCastException을 던집니다.

    var activityCallback: ButtonListener? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            if (context is ButtonListener) {
                activityCallback = context
            }
        } catch (e: ClassCastException) {
            throw ClassCastException("$context must implement ButtonListner")
        }
    }

  • 클릭 이벤트가 발생하면 activityCallback을 통해 연결된 Activity에 이벤트를 전달
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val binding = FragmentABinding.inflate(inflater, container, false)
        binding.button.setOnClickListener {
            activityCallback?.onButtonClick()
        }
        // 여기서 binding 을 이용해 (지역)변수들 이용가능!
        return binding.root
    }
}

  1. FragmentB 가 FragmentA 가 요구하는 기능을 메소드(methodB)로 구현
  1. Hoisting Activity 는 FragmentA 가 정의한 인터페이스 상속
class MainActivity : AppCompatActivity(), FragmentA.ButtonListener, FragmentB.ButtonListenerB {
	override fun onButtonClick() {
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.fragment_container, FragmentB())
            addToBackStack(null)
            commit()
        }
    }








  • findFragmentById(R.id.progress_fragment) : FragmentManager를 사용하여 프래그먼트를 찾는 메서드. R.id.progress_fragment는 해당 프래그먼트의 ID를 나타냅니다.
  • as ProgressFragment : 찾은 프래그먼트를 ProgressFragment로 캐스트. as 키워드는 타입 캐스트를 의미
  • progressFragment.changeProgressBar(cnt) : ProgressFragment로 캐스트한 후, 해당 프래그먼트의 changeProgressBar 메서드를 호출하여 전달된 카운트(cnt)를 사용하여 프로그레스를 업데이트
// MainActivity.kt
override fun onButtonClick(cnt: Int) {
        val progressFragment =
            supportFragmentManager.findFragmentById(R.id.progress_fragment) as ProgressFragment
        progressFragment.changeProgressBar(cnt)
    }





0개의 댓글