как предотвратить разрушение фрагментов - PullRequest
0 голосов
/ 23 января 2020

в своей активности я загружаю 4 фрагмента по коду ниже:

 supportFragmentManager.beginTransaction()
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .replace(R.id.frame, fragmentList[0])
                    .commit()

, но проблема в том, что каждый фрагмент имеет много данных и должен загружать много данных с сервера. и это занимает немного много. Я хочу, чтобы мой фрагмент не был уничтожен при изменении их, чтобы предотвратить загрузку данных снова Как мне это сделать? есть ли способ, что фрагменты просто будут скрыты, а не уничтожены и при загрузке они просто обнаружатся?

Ответы [ 2 ]

1 голос
/ 23 января 2020

вместо замены используйте .add(containerId, newFragment) и затем .hide(currentFragment)

edit:

supportFragmentManager.beginTransaction()
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .add(R.id.frame, fragmentList[0])
                        .hide(fragmentList[1]) // assumed that fragmentList[1] is your current fragment
                        .commit()
0 голосов
/ 23 января 2020

Контроллер пользовательского интерфейса, такой как Activity или Fragment, не должен отвечать за запрос и загрузку данных. Создайте модель представления, которая обрабатывает загрузку данных и ссылку на них. Ваши фрагменты, которым это необходимо, могут наблюдать данные через LiveData.

Если вы передадите экземпляр Activity в ViewModelProvider, ViewModel будет жить столько же, сколько и Activity, а не только для жизни фрагмента:

// in onViewCreated():
model = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)

Если вы используете KTX:

// a fragment class property:
val model: MyViewModel by activityViewModels()
model = 
...