Fragment위에 Fragment 띄우기

김흰돌·2023년 3월 4일
0

개인 프로젝트를 하는 도중 Fragment위에 Fragment 를 띄워야 할 상황이 생겨 childFragmentManager를 사용해보고 기록하려고 한다.

FragmentManager

Activity에서 Fragment와의 상호작용에선 supportFragmentManager를 사용하지만
Fragment 내의 Fragment와 상호작용 하기 위해선 childFragmentManager를 사용하면 된다.


본인은 아래와 같은 화면에서 "위치를 정해주세요!" 라는 텍스트를 선택하면


구글 지도를 띄우기 위해 childFragmentManager를 사용했다.


코드

글 작성 Fragment에 텍스트를 선택했을 시 함수 호출

binding.tvMap.setOnClickListener {
	addMapFragment()
}

add

Fragment를 교체하는 게 아니라 위에 얹기 위해 add로 작성했다.

private fun addMapFragment() {
	childFragmentManager.beginTransaction()
		.add(R.id.fragment_mapview, PostMapFragment())
		.setReorderingAllowed(true)
		.addToBackStack(null)
		.commit()
}

add의 파라미터에 들어가는 값은
add('현재 Fragment의 태그 id', 위에 얹을 Fragment)로 작성하면 된다.
본인은 binding.tvMap 밑에

<fragment
        android:id="@+id/fragment_mapview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="10dp"
        app:layout_constraintTop_toBottomOf="@+id/tv_map"
        app:layout_constraintBottom_toTopOf="@+id/btn_completion"
        ...

태그를 추가했고 이 태그의 id 값을 적었다


replace

Fragment 자체를 전환하고 싶으면 .replace로 작성하면 된다.
replace의 파라미터는 화면을 전환하는 것이므로
본인 같은 경우는 constraintLayout id를 기입했다.

private fun addMapFragment() {
	childFragmentManager.beginTransaction()
		.replace(R.id.fragment_post, PostMapFragment())
		.setReorderingAllowed(true)
		.addToBackStack(null)
		.commit()
}

그럼 아래와 같이 화면이 전부 전환되는 모습을 볼 수 있다.


그 외 함수 설명

출처
addToBackStack()을 호출하면 트랜잭션이 백 스택에 커밋됩니다. 사용자는 나중에 트랜잭션을 취소하고 뒤로 버튼을 눌러 이전 프래그먼트를 다시 가져올 수 있습니다. 단일 트랜잭션 내에서 여러 프래그먼트를 추가하거나 삭제한 경우 이러한 모든 작업은 백 스택이 표시되면 실행취소됩니다. addToBackStack() 호출에 제공된 선택적 이름을 통해 popBackStack()을 사용하여 특정 트랜잭션으로 다시 돌아갈 수 있습니다.

setReorderingAllowed(true)는 애니메이션과 전환이 올바르게 작동하도록 트랜잭션과 관련된 프래그먼트의 상태 변경을 최적화합니다. 애니메이션과 전환으로 탐색하는 방법에 관한 자세한 내용은 프래그먼트 트랜잭션 및 애니메이션을 사용하여 프래그먼트 간 탐색을 참고하세요.

0개의 댓글