본문 바로가기

Android

BottomNavigationView를 이용한 Fragment 전환

728x90

BottomNavigationView를 이용해 MainActivity에서 Fragment를 전환하며 출력하도록 작성했습니다.

 

 

1. UI 디자인

BottomNavigationView에서 Item을 클릭하게되면, FragmentContainerView에 해당 Fragment가 표시될 수 있도록 아래와 같이 작성해줍니다.


<?xml version="1.0" encoding="utf-8"?>
<layout>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".presentation.MainActivity">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/fragmentContainer"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toTopOf="@id/bottomNav" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNav"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@color/cheese_light_lv3"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:menu="@menu/bottom_navigation_menu" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

 

2. Fragment 생성

companion object를 통해 Fragment를 싱글톤으로 생성하고, FragmentManager에서 Fragment를 찾을 때 해당 TAG 상수를 통해 찾기위해서 생성했습니다.


class MyFragment : BaseFragment<MyViewModel, FragmentMyBinding>() {
    override val viewModel: MyViewModel by viewModel()

    override fun getDataBinding(): FragmentMyBinding
        = FragmentMyBinding.inflate(layoutInflater)

    override fun observeData() {}

    companion object {
        fun newInstance() = MyFragment()

        const val TAG = "MyFragment"
    }
}

 

 

3. BottomNavigationView event

아래의 코드를 onCreate() 생명주기 메서드에서 호출되도록 작성해주면 됩니다.

BottomNavigationView의 Item을 클릭하면, 해당 Fragment의 인스턴스를 생성하여, TAG와 함께 showFragment()에 전달하고, 이것들을 이용해 작업을 할 것입니다.

 

아래 코드를 보면 fragmentTransaction가 있습니다.

Transaction과 관련된 replace(), add(), remove(), show(), hide()와 같은 작업 후,  적용하려면 commit()을 호출해야합니다. 

 

replace()를 쓸 수 있지만, 생명주기를 보존하면서 빠른 전환을 할 수 있도록, show(), hide()를 사용했습니다.


 private fun showFragment(fragment: Fragment, tag: String) {

        /**
         * 1. 주어진 Tag를 가진 Fragment가 가져옴
         * 2. FragmentTransaction을 가져와 각종 Transaction 작업을 할 수 있도록 함
         */
        val findFragment = supportFragmentManager.findFragmentByTag(tag)
        val fragmentTransaction = supportFragmentManager.beginTransaction()

        /**
         * Fragment가 교체되기전 모든 Fragment들을 화면에서 숨김
         */
        supportFragmentManager.fragments.forEach { fm ->

            fragmentTransaction.hide(fm)
            //fragmentTransaction.hide(fm).commit()
        }

        /**
         * 주어진 Tag를 가진 Fragment가 있으면 show(), 없다면 add()
         */
        findFragment?.let { fm ->

            fragmentTransaction.show(fm).commit()
        } ?: kotlin.run {

            fragmentTransaction
                .add(R.id.fragmentContainer, fragment, tag)
                .commitAllowingStateLoss()
        }
    }