본문으로 건너뛰기

05.12 일지

🎯 Fragment안에 Fragment 띄우기


Fragment in Fragment를 위한 과정

OuterFragment.kt에서 FragmentManager 사용

childFragmentManager.beginTransaction()

OuterFragmentLayout.xml에서 FrameLayout 자리마련

<FrameLayout />

OuterFragment.kt에서 InnerFragment를 받아올 container = FrameLayout 관리

val container = root.findViewById<FrameLayout>(R.id.FRAME_LAYOUT)

InnerFragment의 화면이 상단 AppBar와 겹쳐서 위쪽이 잘리는 문제

: OuterFragment가 만들어내는 화면 내에서 AppBar와 InnerFragment가 중첩되지 않게 레이아웃이 차지하는 공간 구분이 명확해야함
OuterFragmentLayout.xml 레이아웃 파일에서 CoordinateLayoutLinearLayout 수정 후 문제해결


😞 CoordinateLayout은 정체가 뭔가..?



InnerFragment의 화면이 하단 NavigationBar와 여전히 겹치는 문제

why? NavigationBar는 현재 OuterFragment를 포함하는 상위 Activity에서 정의되므로 현재 파일의 레이아웃 변화로 해결할 수 없음
😞 ⇒ Activity의 레이아웃을 ConstraintLayoutLinearLayout 바꾼다면?
⇒ 하단바 자체가 사라져버린다..

😀 ⇒ 어차피 스크롤 가능한 InnerFragment를 만드므로, InnerFragment를 담는 LinearLayout에 패딩 추가(아래 하단바 크기 만큼)



🎯 탭바를 눌렀을 때 탭에 맞는 페이지 띄우기

: "누름"이라는 이벤트를 다뤄야하므로 kt파일에서 다뤄진다.


사용할 TabLayout 객체로 받아오기

val tabLayout = root.findViewById<TabLayout>(R.id.TABS)

전에도 쓴 것 같지만 root는 FragmentBinding.inflate()로 만들어진 연관된 View의 모임이다.


Tab 이벤트 핸들링

tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener{
override fun onTabUnselected(tab: TabLayout.Tab?) {}
override fun onTabSelected(tab: TabLayout.Tab?) {}
override fun onTabReselected(tab: TabLayout.Tab?) {}
})
  1. TabLayout 가져오기 : 사용할 레이아웃 객체를 정의하는 것
  2. addOnTabSelectedListener를 활용해서 객체를 전달
    : TabLayout에 Listener를 덧붙임으로써 탭에서 '이벤트'의 발생을 감지할 수 있게된다
  3. OnTabSelectedListener 객체의 메소드들 재정의 : 탭에서 발생하는 정해진 '이벤트'를 받았을 때 어떻게 핸들링할지 결정

Tab 이벤트 핸들링해서 InnerFragment 띄우기

: Tab을 누르면 이전 Tab의 Fragment가 삭제되고 새로운 Tab의 Fragment를 화면(FrameLayout)에 띄운다


이전 Tab의 Fragment가 삭제된다

다른 Tab을 누르면 = 지금의 Tab 선택이 없어지면 = onTabUnselected()
기존의 Fragment가 없어지게 = .remove(FRAGMENT)

override fun onTabUnselected(tab: TabLayout.Tab?) {
childFragmentManager.beginTransaction()
.remove(childFragments[tab!!.position])
.commit()
}

새로운 Tab의 Fragment FrameLayout에 뜬다

Tab을 누르면 = onTabSelected()
Fragment가 뜨게 = .add(FRAME_LAYOUT, FRAGMENT)

override fun onTabSelected(tab: TabLayout.Tab?) {
childFragmentManager.beginTransaction()
.add(container.id, childFragments[tab!!.position])
.commit()
}

😞 ⇒ 다루고 있는 OuterFragment에서 다른 Fragment화면을 들렸다 돌아온 경우 기존에 화면에 떠있던 InnerFragment가 삭제되지 않고 중복돼있는 문제발생

문제분석: 기존 Fragment 삭제는 Tab 변환시에만 발생하므로, Tab 변환이 아닌 Fragment의 이동으로는 Fragment를 삭제시키지 못한다.

→ Fragment도 생애주기 관리가 가능하므로 이런 방식을 이용해서 처리해볼 생각이다.