Почему пакет saveInstanceState, который я передаю своему фрагменту Android, пуст по прибытии? - PullRequest
0 голосов
/ 18 апреля 2020

В разрабатываемом приложении Android у меня есть фрагмент списка, который показывает RecyclerView элементов списка. Когда мы открываем фрагмент в первый раз, он извлекает список из URL, но он не будет меняться достаточно часто, чтобы продолжать его перезагружать, поэтому я хочу сохранить данные. Насколько я могу сказать, Android способ сделать это - использовать savedInstanceState для фрагмента, например:

class ItemListFragment() {

    private var itemCards: RecyclerView? = null;

        public val Items: ArrayList<Item> = ArrayList<Item>()

    override fun onViewStateRestored(savedInstanceState: Bundle?) {
        super.onViewStateRestored(savedInstanceState)
        if ( Items.size == 0 && savedInstanceState != null && savedInstanceState.containsKey("items")) {
            val arrayType = object: TypeToken<Array<Item>>() {}.type
            val tempItems: Array<Item> = Gson().fromJson(savedInstanceState.getString("items"), arrayType)
            Items.addAll(tempItems)
        }
    }

}

Затем я управляю состояниями в моем MainActivity следующим образом:

class MainActivity : AppCompatActivity() {

        private lateinit var restoreBundle: HashMap<String, Bundle>

        private var currentFragment = ""

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            restoreBundle = HashMap<String, Bundle>()
            setContentView(R.layout.activity_main)
    }

   override fun onNavigationItemSelected(item: MenuItem): Boolean {
            // Handle navigation view item clicks here.
            drawFragment(item.itemId)
   }

        private fun drawFragment(position:Int) {
            val fragMan: FragmentManager = getSupportFragmentManager()
            val fragmentName = getFragmentName(position)
            val bundle:Bundle = restoreBundle.get(fragmentName) ?: Bundle()

            var fragment: Fragment? =   fragMan.getFragment(bundle, fragmentName)

            if ( fragment == null ) {
                fragment =  ItemListFragment() as Fragment
            }

            val current = fragMan.findFragmentByTag(currentFragment)

            if (current != null) {
                    val frag = getFragmentName(current.id)
                    val recover : Bundle =  restoreBundle.get(frag) ?: Bundle()
                    current.onSaveInstanceState(recover)
                    restoreBundle.set(frag, recover);
            }


                if (fragmentSet) {
                    fragMan.beginTransaction()
                        .replace(R.id.main_content_fragment, fragment!!, fragmentName).commit()
                } else {
                    fragMan.beginTransaction()
                        .add(R.id.main_content_fragment, fragment!!, fragmentName).commit()
                }
            currentFragment = fragmentName

        }
} 

Оба эти примера были урезаны до того, что мне кажется уместным, но код может быть не столько проблемой, сколько тем, что я пытаюсь сделать. В основном, когда я переключаю фрагмент несколько раз и он вызывает fragMan.getFragment(bundle, fragmentName), bundle содержит правильное сохраненное состояние экземпляра, но когда я попадаю в ItemListFragment.onViewStateRestored (это следующее место, я могу установить точку останова, насколько я могу судить, ) пакет savedInstanceState равен нулю.

Почему пакет, который я передаю, не совпадает с пакетом, который извлекается или , как правильно передать состояние экземпляра моему фрагмент?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...