Как сохранить состояние фрагмента после транзакции замены? - PullRequest
0 голосов
/ 08 января 2019

У меня есть два фрагмента (предположим, FragmentA и FragmentB ) в приложении для Android, которые я переключаю с помощью BottomBar .

У меня есть список данных, которые выбираются с помощью Retrofit , которые я отображаю с помощью RecyclerView в FragmentA , и у меня есть MapView in FragmentB .

Моя проблема заключается в том, что всякий раз, когда я переключаюсь с FragmentB на FragmentA , , вызовы API снова выбирают список данных . И когда я переключаюсь с FragmentA на FragmentB , MapView снова отображается с начала.

Есть ли способ, которым я могу сохранить состояние FragmentA, то есть список данных, как есть, пока я не уничтожу Activity? и сохранить MapView во FragmentB как есть?

Я использовал следующее для замены фрагмента.

public void replaceFragment(Fragment fragment // This can be FragmentA or FragmentB) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.framelayout, fragment);
        transaction.commit();
    }

Я просто хочу чтобы фрагменты сохранили свое состояние и не реинициализировали каждая вещь, пока деятельность не будет уничтожена. Я думаю, что жизнь Методы цикла фрагментов играют здесь важную роль.

Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Компоненты архитектуры лучше подходят для вашего сценария. Используйте LiveData и ViewModel .

  1. Внутри Упражнения создайте модель представления и обновите оперативные данные с помощью ответа сервера.

  2. Во фрагменте используйте текущие данные для обновления представлений.

В этом случае жизненный цикл ViewModel присоединяется к операции, и транзакции фрагментов не влияют на сохраняемые данные. Поскольку вы обновляете данные из LiveData, при создании действия будет сделан только один вызов API. В дополнение к этому ViewModel переживает изменения ориентации, что означает, что ваши LiveData по-прежнему содержат ответ API.

0 голосов
/ 08 января 2019

В MyActivity, Объявить оба фрагмента объектов выше onCreate:

private Fragment1 fragment1 = new Fragment1();
private Fragment2 fragment1 = new Fragment2();

Нажав на BottomBar, вы можете установить щелчок для отображения и скрытия обоих фрагментов.

Установить фрагмент1 выбран

private void fragment1Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment1 == null || !fragment1.isAdded()) {
            fragment1 = new Fragment1();
            transaction.add(R.id.framelayout, fragment1);
        } else {
            transaction.show(fragment1);
        }

        if (fragment2 != null)
            transaction.hide(fragment2);

        transaction.commit();
    }

Установить фрагмент2 выбранным

private void fragment2Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment2 == null || !fragment2.isAdded()) {
            fragment2 = new Fragment2();
            transaction.add(R.id.framelayout, fragment2);
        } else {
            transaction.show(fragment2);
        }

        if (fragment1 != null)
            transaction.hide(fragment1);

        transaction.commit();
    }
...