[Kotlin, Android] 한 Activity에서 여러 Fragment간 전환 문제

[문제 상황 ]

 

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

 

프래그먼트 관리자  |  Android 개발자  |  Android Developers

프래그먼트 관리자 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: Navigation 라이브러리를 사용하여 앱의 탐색을 관리하는 것이 좋습니다. 프레임워크

developer.android.com

 

<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 전환 관련해서 오히려 불편한 점이 있는것 같다.

어쩌면 내가 공부를 덜 해서 모르는 부분이 있을수도 있는거고.. 좀 더 공부가 필요한것을 느꼇다.

간단하고 클린한 코드를 작성하기 위해서 항상 고민하고 있다.