https://developer.android.com/reference/androidx/fragment/app/FragmentContainerView
- 특별히 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.onCreateView 호출
③ FragmentActivity.dispatchFragmentsOnCreateView를 호출
④ FragmentContoller.onCreateView를 호출
⑤ FragmentManager.getLayoutInflaterFactory().onCreate() 호출, 즉 FragmentLayoutInflaterFactory.onCreateView 호출
⑥ FragmentContainerView internal constructor() 호출
> 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에서 종료 animation을 사용하는 Fragment들은 다른 Fragment들보다 먼저 그려진다. 그래서 종료 Fragment들은 view의 맨 위에 노출되지 않는다.
'빈 구멍 채우기' 카테고리의 다른 글
[Android] View 문서 읽기 (1) | 2022.10.07 |
---|---|
[Android][Retrofit][OAuth] OAuth2.0 인증 처리로 변경 (1) | 2022.09.20 |
[Android] API vs SKD 차이 (0) | 2022.08.19 |
[Android] 네트워크 작업 중 간헐적 java.io.IOException: unexpected end of stream on (0) | 2022.08.18 |
[Android] deprecated AsyncTask 수정 > RxJava 이용하기 (0) | 2022.08.18 |