[문제 상황 ]
Instagram의 기능을 개인 앱 개발로 개발하는 중에 발생한 문제이다.
하나의 액티비티에서 fragment 들을 띄울 때 viewpager를 사용하는 방법이 있다.
하지만 viewpager로만 화면 전환을 할 경우 화면에 tab layout이 남아있고,
tab layout에 모든 fragment를 추가하기에는 너무 복잡하고 보기에 좋지 않다.
따라서 view pager에 띄운 fragment에서 tab layout에 없는 다른 fragment로 전환하는 방법이 필요했다.
[해결 방안]
<step1> fragment 들을 띄울 main activity에서 viewpager와 tablayout을 포함하는 layout을 제작한다.
<!--main activity의 layout xml 파일-->
<LinearLayout
.......
android:id = "@+id/view_container" / >
<androidx.viewpager2.widget.ViewPager2
android:id = "@+id/view_pager" / >
<com.google.android.material.tabs.TabLayout
android: id = "@+id/tab_layout" / >
<LinearLayout>
<step2> 이제 각 fragment 들은 viewpager와 tablayout을 포함하는 하나의 layout인 view_container를 통해서
교체 되어야 한다.
main activity에서 각 fragment들을 교체 할 수 있는 코드를 작성한다.
fun onFragmentChange(goFragment: Fragment){
frManager.beginTransaction().replace(R.id.view_container,goFragment)
.addToBackStack(null)
.commit()
}
fun onFragmentGoBack(fragment: Fragment){
frManager.beginTransaction().remove(fragment).commit()
frManager.popBackStack()
}
위의 두가지 코드를 작성했다.
첫번째 함수는 새로운 fragment로 교체해주는 함수, 두번째 함수는 이전의 fragment로 돌아가는 함수이다.
onFragmentChange이 동작할 경우 이전에 작성한 view_container를 새로 이동할 fragment로 교체해준다.
onFragmentGoBack이 동작할 경우 frmanager에 쌓인 현재 fragment를 제거하고 이전의 fragment로 돌아간다.
frManager = this@UserActivity.supportFragmentManager
위에서 frManager은 현재 엑티비티의 supportFragmentManager를 뜻한다.
이는 fragment의 추가, 삭제, 교체등의 작업을 도와준다.
자세한 사항은 아래 android 개발자 링크에서 확인할 수 있다.
프래그먼트 관리자 | Android 개발자 | Android Developers
<step3> 해당 작성 함수를 필요한 fragment에서 동작 시켜준다.
나는 메시지 목록을 보는 fragment에서 해당 함수가 필요했다.
우선 메시지 목록을 보는 fragment인 MessageRoomListFragment로 이동하는 코드를 작성한다.
getMessageList.setOnClickListener {
userActivity.onFragmentChange(MessageRoomListFragment())
}
해당 버튼을 클릭 시 메시지 목록 fragment 로 현재 view_container가 변환된다.
이후에 해당 fragment안에서 뒤로가는 코드를 구성해준다 .
goBackButton.setOnClickListener {
userActivity.onFragmentGoBack(this@MessageRoomListFragment)
}
버튼을 클릭시 이전의 fragment로 view_container가 변환된다.
[리뷰]
코드는 간단하게 작성했지만 꽤 많은 고민을 했었던 것 같다.
viewpager2가 viewpager보다 훨씬 편리해졌지만 fragment 전환 관련해서 오히려 불편한 점이 있는것 같다.
어쩌면 내가 공부를 덜 해서 모르는 부분이 있을수도 있는거고.. 좀 더 공부가 필요한것을 느꼇다.
간단하고 클린한 코드를 작성하기 위해서 항상 고민하고 있다.