중첩 프래그먼트의 특징은 XML로 추가할 수가 없고, 항상 동적으로 추가해야한다.
그렇기 때문에 부모 프래그먼트는 자식 프레그먼트를 관리하고 자식프래그먼트가 UI를 담당하는 구조로 자주 설계된다.
액티비티에서 프래그먼트를 다룰 때는 getSupportFragmentManager()를 사용하였지만 중첩 프래그먼트를 다룰 때는, getChildFragmentManager()를 사용한다.
public class TestFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState); //Todo XML Inflate
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
/**
* 자식 프레그먼트 생성
*/
FragmentManager childFragment = getChildFragmentManager();
childFragment.beginTransaction()
.add(R.id.fragment_container, ChildFragment,getInstance(argments))
.addToBackStack(null)
.commit();
/**
* 종료
*/
getChildFragmentManager().popBackStack();
}
}
중첩된 프래그먼트와 뒤로 가기 키를 누를 때, 액티비티에서 부모 프래그먼트를 사용하여, 백스택을 체크하해 제거한다.
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment parent = fragmentManager.findFragmentById(R.id.fragment_container);
if(parent != null) {
if(parent.getChildFragmentManager().getBackStackEntryCount() > 0) {
parent.getChildFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
위에서 중첩 프래그먼트에서는 부모 프래그먼트가 관리를 담당하고 자식이 UI를 담당한다고 했는데,
그렇다면, 부모는 화면 세로에서 가로모드등 변화로 액티비티가 종료되고 재 생성될 때, Activity.onCreate 콜백이 호출되어 프래그먼트도 다시 생성되게 되는데 굳이 그럴 필요는 없기때문에 이를 막는 코드가 필요하다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mFragment = getSupportFragmentManager().findFragmentByTag(TestFragment.TAG);
if(mFragment != null) {
mFragment = mFragment.getInstance();
getSupportFragmentManager().beginTransaction()
.add(mFragment, TestFragment.TAG)
.commit();
}
}
이 코드에서는 태그를 가지고 처리하였다.
'Android > Development Tips' 카테고리의 다른 글
Custom view 에서 Koin 사용해 ViewModel 주입할 때 주의 할점 (0) | 2019.08.05 |
---|---|
YUV420_8888 to NV21 (0) | 2019.04.16 |
커스텀 뷰의 초기화 시점 (0) | 2018.12.12 |
커스텀뷰와 merge 태그 (0) | 2018.12.12 |
안드로이드 패딩과 마진 (0) | 2018.12.12 |