안드로이드
[Android Kotlin] 안드로이드 코틀린 Fragment 상태 유지
행복하개!
2020. 5. 10. 00:35
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의 상태가 유지되지 않고 새로 만들어진다.