본문 바로가기

빈 구멍 채우기

[Android] androidx.fragment.app.FragmentContainerView

https://developer.android.com/reference/androidx/fragment/app/FragmentContainerView

 

FragmentContainerView  |  Android Developers

androidx.car.app.managers

developer.android.com

  • 특별히 Fragment를 위해 커스텀된 Layout.
  • FrameLayout을 상속받음
  • Fragment Transaction 처리가 안정적
  • Fragment 동작을 조정하는 추가적인 기능 제공

 

  • 일반적으로 Activity의 xml layout에서, Fragment 컨테이너로서 사용되어야 한다.

 

  • android:name 속성을 이용해 Fragment를 추가할 수 있다. 다음의 일회성 작업을 진행한다.

    1. Fragment의 새 인스턴스 하나를 생성한다.

    2. Fragment.onInflate()를 호출한다.

    3. 알맞은 FragmentManager에 Fragment를 추가하기 위해 FragmentTransaction을 실행한다.

 

내부 코드 확인

① FragmentActivity에서 FragmmentController가 필드로 존재한다.

FragmentActivity의 FragmentContorller

② FragmentActivity.onCreateView 호출

FragmentActivity의 onCreateView. 그 안의 dispatchFragmentsOnCreateView

③ FragmentActivity.dispatchFragmentsOnCreateView를 호출

FragmentActivity의 dispatchFragmentsOnCreateView. 그 안에서 FragmentController의 onCreateView

④ FragmentContoller.onCreateView를 호출

FragmentController의 onCreateView. 그 안의 FragmentManager.getLayoutInflaterFactory.onCreate

⑤ FragmentManager.getLayoutInflaterFactory().onCreate() 호출, 즉  FragmentLayoutInflaterFactory.onCreateView 호출

FragmentManager.getLayoutInflaterFactory. LayoutInflater.Factory2를 반환한다.
FragmentManager의 mLayoutInflaterFactory. 실제로는 LayoutInfater.Factory2를 상속받은 FragmentLayoutInflaterFactory를 사용함.
LayoutInflater.Factory2를 상속한 FragmentLayoutInflaterFactory의 onCreateView. FragmentContainerView를 생성함.

⑥ FragmentContainerView internal constructor() 호출

FragmentContainerView의 internal constructor.  FragmentTransaction을 실행함.

>  Activity의 xml layout에서 Fragment의 컨테이너로 FragmentContainerView를 쓰라는 이유를 알 수 있다. FragmentActivity에서 뷰 create를 하면서 FragmentContainerView의 internal constructure를 호출한다. 

 

  • android:tag 속성을 옵션으로 추가하면 FragmentManagr.findFragmentByTag를 이용해 추가된 Fragment를 반환할 수 있다.

 

  • Fragment 사용 이외에 다른 ViewGroup들(FrameLayout, LinearLayout 등)을 대체하기 위해 사용되어서는 안된다.

 

  • FragmentContainerView에 직접적인 View 추가는 불가능하다. Fragment.onCreateView()로 반환된 프래그먼트에 View들을 추가해야 한다. FragmentContainerView에 직접적으로 뷰를 추가하려고 하면 IllegalStateException을 발생시킨다.

 

  • 17 초과의 API에서 FragmentContainerView 사용시 레이아웃 애니메이션과 트랜잭션은 사용 불가하다. 그 외에는, 애니메이션은 FragmentTransaction.setCustomAnimations를 이용한다. 만약 animateLayoutChange가 true로 설정되거나 setLayoutTransition이 직접적으로 호출되면 UnsupportedOperationExcpetion이 발생된다.

> setLayoutTransition은 API 버전이 17을 초과할 시 UnspportedOperationException이 발생한다.

FragmentContainerView의 setLayoutTransition

  • FragmentContainerView에서 종료 animation을 사용하는 Fragment들은 다른 Fragment들보다 먼저 그려진다. 그래서 종료 Fragment들은 view의 맨 위에 노출되지 않는다.