Получение изменений на объект из другого фрагмента - PullRequest
0 голосов
/ 26 июня 2018

Допустим, у нас есть два фрагмента A и B. Мы отправляем объект O1 из фрагмента A в B, используя Bundle, и вносим фрагмент B в текущую активность. Делаем некоторые изменения с O1, т.е. сохраняем данные в объекте полезной нагрузки O1, и теперь мыВернитесь к фрагменту A, где находится кнопка сохранения.Теперь, если мы сохраним данные, которые есть у O1, т.е. O1.savetoDatabase (), мы не получим изменения данных, которые мы сделали во фрагменте B. Есть ли возможный способ получить изменения во фрагменте A для объекта, переданного во фрагмент B?(что-то вроде ссылок, которые вызывают изменения)

РЕДАКТИРОВАТЬ: второй ответ, который использует setTargetFragment, кажется, работает, но единственная проблема заключается в том, когда я нахожусь на фрагменте B и затем отправляю данные на фрагмент A, я получаюданные в объекте O1 (это нормально работает) фрагмента A, но когда я нажимаю кнопку возврата от фрагмента B к фрагменту A, данные в O1 теряются из-за воссоздания фрагмента.Что нужно сделать, чтобы сохранить отправленные данные?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вы можете использовать setTargetFragment (). Создать геттер и сеттер для вашего объекта.

public class FragmentA extends Fragment {
    private String mName;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        FragmentB fragmentB = new FragmentB();
        fragmentB.setTargetFragment(this, 1111);
    }

    public String getmName() {
        return mName;
    }

    public void setmName(String mName) {
        this.mName = mName;
    }
}

public class FragmentB  extends Fragment {
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ((FragmentA)getTargetFragment()).setmName("xyz");
    }
}

Или Вы можете использовать метод onActivityResult для отправки данных через намерение, как показано ниже, из фрагмента B в FragmentA.

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)
0 голосов
/ 26 июня 2018

Рекомендуемый способ связи между фрагментами - создать общий объект ViewModel.Оба фрагмента могут получить доступ к ViewModel через содержащую их активность.Фрагменты могут обновлять данные в ViewModel, и если данные предоставляются с использованием LiveData, новое состояние будет передано другому фрагменту, пока он наблюдает LiveData из ViewModel.Чтобы узнать, как реализовать этот вид связи, прочитайте раздел «Обмен данными между фрагментами» в руководстве по ViewModel.

ref.- https://developer.android.com/training/basics/fragments/communicating

ViewModel - это класс, который отвечает за подготовку и управление данными для Действия или Фрагмента.Он также управляет связью Activity / Fragment с остальной частью приложения (например, вызовом классов бизнес-логики).

ViewModel всегда создается в связи с областью действия (фрагментом или действием) и будетбыть сохраненным, пока область жива.Например, если это действие, до его завершения.

Другими словами, это означает, что ViewModel не будет уничтожен, если его владелец будет уничтожен для изменения конфигурации (например, ротация).Новый экземпляр владельца будет просто повторно подключен к существующей ViewModel.

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

ref.- https://developer.android.com/reference/android/arch/lifecycle/ViewModel

проверьте это тоже

Обмен данными между фрагментами с использованием нового архитектурного компонента ViewModel

надеюсь, это поможет

0 голосов
/ 26 июня 2018

Отправьте модифицированный O1 фрагменту A, используя Bundle.Или вы можете использовать Eventbus для наблюдения за изменениями https://github.com/greenrobot/EventBus

...