안드로이드

[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의 상태가 유지되지 않고 새로 만들어진다.