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()
}
}
'Android' 카테고리의 다른 글
Retrofit2, OkHttpInterceptor, Koin, RxKotlin, Coroutine, Sandwich 등을 이용해 내가 작성한 네트워크 통신 방법 (0) | 2022.03.05 |
---|---|
RecyclerView) BaseAdapter, BaseViewMdoel, BaseModel, DiffUtil : 공통 어답터와 뷰홀더를 이용해 리사이클러뷰 사용하기 (0) | 2021.08.04 |
TabLayout + ViewPager2를 이용한 화면 구성 (0) | 2021.08.02 |
DI (Koin)을 이용한 의존성 주입 (0) | 2021.08.02 |
Android Studio : 유용한 단축키 (0) | 2021.07.11 |