Fragment 간 통신은 Fragment 끼리 직접 통신할 수 없다
hosting Activity 를 거쳐 이루워진다.
- FragmentA 가 인터페이스(MyListener) 정의
추상 메소드(onMethodA) 선언
FragmentA 의 뷰에 이벤트 발생
Hosting- FragmentB 가 FragmentA 가 요구하는 기능을 메소드(methodB)로 구현
- Hoisting Activity 는 FragmentA 가 정의한 인터페이스 상속
추상메소드 구현
FragmentB 의 메소드(methodB()) 호출
- 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")
}
}
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
}
}
- FragmentB 가 FragmentA 가 요구하는 기능을 메소드(methodB)로 구현
- 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)
}