Fragment안에 Fragment를 추가하여 더 관리할 경우가 생기는데요,
예를들어 ViewPager나 TabLayout의 Fragmet중 하나에서 Fragment를 여러개 교체하거나 관리할 수 있습니다.
MainActivity에 Fragment1과 Fragment2가 있고, Fragment1 에서 ChildFrag1. ChildFrag2, ChildFrag3 을 추가하거나 교체한다고 생각해보겠습니다.
MainActivity > Fragment1, Fragment2
Fragment1 > ChildFrag1,ChildFrag2,ChildFrag3
Fragment 추가/교체
- MainActivity에 Fragment1을 추가
val fragment1 = Fragment1().getInstance()
supportFragmentManager.beginTransaction().replace(R.id.container, fragment1).commit()
Fragment1안에서 Fragment2로 교체하거나, ChildFragment1을 추가하는 것은 다음과 같이
parentFragmentManager(getParentFragmentManager())와
childFragmentMaganer(getChildFragmentManager())를 구분하여 사용하면 됩니다.
- Fragment1 안에서 MainActivity container를 Fragment2로 교체
parentFragmentManager.beginTransaction().replace(R.id.container, fragmment2).commit()
- Fragment1에 ChildFrag1추가
Fragment1에 layout id frag_container를 만들고, childFragmentManager를 사용해야 합니다.
childFragmentManager.beginTransaction().replace(R.id.frag_container, childFragment1).commit()
parentFragmentManager와 childFragmentManager의 사용이 헷갈린다면 교체해줄 container layout이 어디에 있는지를 생각해보면 됩니다.^^(나의 layout에 있다면 child.)
Back 버튼 클릭시 돌아가기 (BackStack 추가)
back버튼을 클릭했을때 이전 frament로 돌아가고 싶다면, backstack에 추가하여야 합니다.
- Fragment1에서 Fragment2로 교체시, backstack 추가
parentFragmentManager.beginTransaction().apply{
replace(R.id.container, fragmment2)
addToBackStack(null)
commit()
}
위와 같이 하면 Fragment1에서 Fragment2로 교체 후 , Back 버튼을 누르면 Fragment1로 돌아갑니다.
- ChildFrag1에서 ChildFrag2를 추가했을 경우
만약 Fragment1안에 있는 ChildFrag1에서 ChildFrag2로 교체하고, Back 버튼 클릭 시 ChildFrag1로 돌아가고 싶다면,
위와 같이 addToBackStack에 추가하고, Fragment1이 있는 MainAcitivity에서 onBackPressed 를 override하여 fragment1에서의 백버튼 처리도 추가해주어야 합니다^^;
- ChildFrag1안에서 ChildFrag2로 교체시 addToBackStack추가 (ChildFrag1의 안이므로 parentFragmentManager사용.)
parentFragmentManager.beginTransaction().apply {
replace(R.id.frag1_container, childFragment2)
addToBackStack(null)
commit()
}
- MainActivity에서 onBackPressed() override
override fun onBackPressed() {
if(fragment1.isVisible) {
if (fragment1.childFragmentManager.backStackEntryCount >= 1) {
fragment1.childFragmentManager.popBackStackImmediate()
} else {
super.onBackPressed()
}
}else{
super.onBackPressed()
}
}
popBackStackImmediate()를 사용하여 fragment1의 backstack이 쌓였을 경우 먼저 처리해줍니다.^^
fragment1은 singletone으로 구성하여 위의 코드는 동작할 수 있었습니다.
위와 같이 Fragment안의 Fragment들을 유동적으로 사용할 수 있었습니다. 굿!
'Android > 이론' 카테고리의 다른 글
[안드로이드] Koin으로 주입된 viewModel 쉽게 Unit 테스트 하기 (0) | 2021.03.19 |
---|---|
[안드로이드] Cold flows, Hot channels(번역) (0) | 2021.03.17 |
[안드로이드] MediatorLiveData를 이용하여 여러개의 LiveData를 하나의 LiveData로 합치기 (0) | 2021.02.26 |
[안드로이드 Kotlin] Room Database, Repository, ViewModel을 Koin으로 의존성 주입(DI) (0) | 2021.01.11 |