private const val TAG_HOME_FRAGMENT = "home_fragment"
private const val TAG_RECORDS_FRAGMENT = "records_fragment"
private const val TAG_COMMUNITY_FRAGMENT = "community_fragment"
private const val TAG_CAMPAIGN_FRAGMENT = "campaign_fragment"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
// Default Fragment of MainActivity
setFragment(TAG_HOME_FRAGMENT, HomeFragment())
navView.setOnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> setFragment(TAG_HOME_FRAGMENT, HomeFragment())
R.id.navigation_records -> setFragment(TAG_RECORDS_FRAGMENT, RecordsFragment())
R.id.navigation_community -> setFragment(
TAG_COMMUNITY_FRAGMENT,
CommunityFragment()
)
R.id.navigation_campaign -> setFragment(TAG_CAMPAIGN_FRAGMENT, CampaignFragment())
}
true
}
}
/* Fragment State 유지 함수 */
private fun setFragment(tag: String, fragment: Fragment) {
val manager: FragmentManager = supportFragmentManager
val ft: FragmentTransaction = manager.beginTransaction()
if (manager.findFragmentByTag(tag) == null) {
ft.add(R.id.nav_fragment, fragment, tag)
}
val home = manager.findFragmentByTag(TAG_HOME_FRAGMENT)
val records = manager.findFragmentByTag(TAG_RECORDS_FRAGMENT)
val community = manager.findFragmentByTag(TAG_COMMUNITY_FRAGMENT)
val campaign = manager.findFragmentByTag(TAG_CAMPAIGN_FRAGMENT)
// Hide all Fragment
if (home != null) {
ft.hide(home)
}
if (records != null) {
ft.hide(records)
}
if (community != null) {
ft.hide(community)
}
if (campaign != null) {
ft.hide(campaign)
}
// Show current Fragment
if (tag == TAG_HOME_FRAGMENT) {
if (home != null) {
ft.show(home)
}
}
if (tag == TAG_RECORDS_FRAGMENT) {
if (records != null) {
ft.show(records)
}
}
if (tag == TAG_COMMUNITY_FRAGMENT) {
if (community != null) {
ft.show(community)
}
}
if (tag == TAG_CAMPAIGN_FRAGMENT) {
if (campaign != null) {
ft.show(campaign)
}
}
ft.commitAllowingStateLoss()
}
}
내 경우엔 Bottom Navigation 상태에서 활용하였다.
없으면 add로 붙이고, 이미 존재한다면 show 와 hide를 이용해서 Fragment를 관리한다. 이렇게 하지 않고 Fragment 이동시에 replace로만 교체해주면 호출이 될 때마다 Fragment의 상태가 유지되지 않고 새로 만들어진다.
'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 리사이클러뷰 RecyclerView 부드럽게 (0) | 2020.05.24 |
---|---|
[Android] 안드로이드 리사이클러뷰 RecyclerView Scroll 막기 (0) | 2020.05.24 |
[Android Kotlin] 안드로이드 코틀린 다이얼로그 Dialog (0) | 2020.03.27 |
[Android Kotlin] 안드로이드 코틀린 Action Bar (0) | 2020.03.26 |
[Android Kotlin] 안드로이드 코틀린 Pop Up Menu (0) | 2020.03.26 |