오늘도 삽질중

Android Fragment Save State 본문

안드로이드

Android Fragment Save State

Choi3950 2021. 12. 18. 22:33
반응형

Android OS 단에서 메모리가 부족하든, 기타 사유로 인해 프래그먼트가 종료되는 경우

프래그먼트의 상태를 저장하는 블로그중에 괜찮은 관련 자료 링크를 모아봤다.

 

 

https://riptutorial.com/android/example/16231/saving-and-restoring-fragment-state

 

Android Tutorial => Saving and Restoring Fragment State

Learn Android - Saving and Restoring Fragment State

riptutorial.com

https://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

 

The Real Best Practices to Save/Restore Activity's and Fragment's state. (StatedFragment is now deprecated)

Months ago I published an article related to Fragment State saving & restoring, Probably be the best way (?) to save/restore Android Fragment’s state so far. A lot of valuable feed

inthecheesefactory.com

 

 

첫번째 블로그의 경우 supportFragmentManager 를 사용할 경우 좋은 방법으로 보여진다.

하지만 ViewPager 에 FragmentList를 담아서 처리하는 경우도 있을것이다.

아래는 직접 사용해본 코드이다.

참고로 테스트는 개발자옵션 -> 활동유지 안함을 체크 후 시도해봤다.

 

(더 좋은 방법이나 의견 또는 피드백 환영합니다. 해당 문제를 해결하기 위해 여러방법을 써봤는데 참 어렵네요...)

 

MainActivity.kt

    private var fragments: MutableList<Fragment> = mutableListOf()
    private var suggestionMainFragment: SuggestionMainFragment? = null
    private var exploreMainFragment: ExploreMainFragment? = null
    private var settingMainFragment: SettingMainFragment? = null

    private var mainViewPagerAdapter: MainViewPagerAdapter? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        if (savedInstanceState != null){
            suggestionMainFragment = supportFragmentManager.getFragment(savedInstanceState , SUGGESTION_TAG) as? SuggestionMainFragment
            exploreMainFragment = supportFragmentManager.getFragment(savedInstanceState , EXPLORE_TAG) as? ExploreMainFragment
            settingMainFragment = supportFragmentManager.getFragment(savedInstanceState , SETTING_TAG) as? SettingMainFragment

            if (suggestionMainFragment == null) suggestionMainFragment = SuggestionMainFragment.newInstance()
            if (exploreMainFragment == null) exploreMainFragment = ExploreMainFragment.newInstance()
            if (settingMainFragment == null) settingMainFragment = SettingMainFragment.newInstance()

            initMainViewPager()

        } else {
            suggestionMainFragment = SuggestionMainFragment.newInstance()
            exploreMainFragment = ExploreMainFragment.newInstance()
            settingMainFragment = SettingMainFragment.newInstance()

            initMainViewPager()
        }

    }
    
   private fun initMainViewPager(){
        fragments.add(suggestionMainFragment!!)
        fragments.add(exploreMainFragment!!)
        fragments.add(settingMainFragment!!)

        mainViewPagerAdapter = MainViewPagerAdapter(this , fragments)
        mainViewPagerAdapter?.also { binding.mainViewPager.adapter = it }
        binding.mainViewPager.isUserInputEnabled = false
    }
    
    
   override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        if (suggestionMainFragment!!.isAdded){
            supportFragmentManager.putFragment(outState , SUGGESTION_TAG , suggestionMainFragment!!)
        }

        if (exploreMainFragment!!.isAdded){
            supportFragmentManager.putFragment(outState , EXPLORE_TAG , exploreMainFragment!!)
        }

        if (settingMainFragment!!.isAdded){
            supportFragmentManager.putFragment(outState , SETTING_TAG , settingMainFragment!!)
        }
    }
    
   companion object {
        const val SUGGESTION_TAG = "tag_suggestion"
        const val EXPLORE_TAG = "tag_explore"
        const val SETTING_TAG = "tag_setting"
    }

 

 

반응형
Comments