본문 바로가기

Android/이론

[안드로이드] Fragment 안의 Fragment 처리(교체, 백스택, Back 버튼 클릭 등) ― parentFragmentManager vs childFragmentManager

728x90
반응형

 

 

 

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들을 유동적으로 사용할 수 있었습니다. 굿!

 

 

 

728x90
반응형