오늘은 프래그먼트 안에 프래그먼트를 두고 onBackPressed 이벤트가 일어날 때 이전의 프래그먼트로 가게 동작시키고 싶었습니다.
그러기 위해서는 먼저 프래그먼트 안에서 프래그먼트를 바꿔줄 필요가 있었습니다
val fragment1 = Fragment1().getInstance()
supportFragmentManager.beginTransaction().replace(R.id.container, fragment1).commit()
기존액티비티에서는 위처럼 supportFragmentManager를 이용하여 프래그먼트를 쉽게 바꿔 줄 수 있었지만 프래그먼트에는 supportFragmentManager가 없기에 다른 매니저를 가져와야 했습니다.
/**
* Return a private FragmentManager for placing and managing Fragments
* inside of this Fragment.
*/
/*
* 이 Fragment 내부에 Fragment를 배치하고 관리하기 위해 개인 FragmentManager를 반환합니다.
*/
@NonNull
final public FragmentManager getChildFragmentManager() {
if (mHost == null) {
throw new IllegalStateException("Fragment " + this + " has not been attached yet.");
}
return mChildFragmentManager;
}
/**
* Return the number of entries currently in the back stack.
*/
/*
* 현재 백 스택에 있는 항목 수를 반환합니다.
*/
public int getBackStackEntryCount() {
return mBackStack != null ? mBackStack.size() : 0;
}
프래그먼트에서는 childFragmentManager를 지원합니다. 해당 프래그먼트 매니저는 동일하게 동작하기에
val transaction = childFragmentManager.beginTransaction()
transaction.replace(R.id.frame_contract, listFragment)
transaction.commit()
이처럼 프래그먼트를 바꾸줄수있습니다.
기존프래그먼트에서 이전의 프래그먼트로 가는 방법은 쉽습니다. addToBackStack함수를 이용한다면 onBackPressed 이벤트시 backStackEntryCount가 1보다 크거나 같다면 액티비티가 꺼지지 않고 이전의 프래그먼트를 이동합니다. 그렇지만 프래그먼트 안의 프래그먼트가 backStackEntryCount가 1보다 크거나 같다고 하더라도 해당액티비티 거기까지는 검사를 하지 않기 때문에
override fun onBackPressed() {
val currentFragment = viewPagerAdapter.getFragment(binding.mainTab.selectedTabPosition)
if (currentFragment is ContactFragment && currentFragment.childFragmentManager.backStackEntryCount >= 1) {
currentFragment.childFragmentManager.popBackStackImmediate()
} else {
super.onBackPressed()
}
}
이와 같이 액티비티에서 하위의 액티비티까지 검사하는 코드를 추가해야 합니다.
'안드로이드 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] 리사이클러뷰(RecyclerView) 스와이프 이벤트 (0) | 2023.09.11 |
---|---|
[Android/Kotlin] attachToParent (0) | 2023.09.05 |
[Android/Kotlin] 알림(Notification) - 1, NotificationChannel 속성 (2) | 2023.09.01 |
[Android/Kotlin] 리사이클러뷰(RecyclerView) 스크롤 이벤트 (2) | 2023.08.31 |
[Android/Kotlin] 알림(Notification)아이디 채널아이디 (2) | 2023.08.30 |