Андроид передача данных между фрагментами

у меня есть один Activity и 5 Fragment ' s. На первом Fragment пользователь вводит номер телефона. На последнем (пятом) Fragment Мне нужно, чтобы отобразить номер телефона, введите другие поля и отправить все данные на сервер. Для каждого Fragment Я использую отдельный презентатор (MVP).

как передать данные от первого фрагмента к последнему?

1) я не хочу пройти через всю цепочку фрагментов, потому что им не нужны эти данные.

2) Если хранить эти данные в хостинг Activity чем мне нужно позвонить ((SomeActivity)getActivity()).getUserData() внутри Fragment class и передайте эти данные Presenter.

3) я выбрал последний подход. Я создал одноэлементный класс UserData. Это простой класс POJO. Я создаю экземпляр UserData в первом Fragment установить необходимые данные и не использовать его в последнем Fragment для извлечения данных и добавления отсутствующих полей.

но я не знаю, это подход с правильным решением singleton. Потому что мне нужно очистить экземпляр singleton, когда пользователь переходит к другому Activity. Если есть лучшее решение?

редактировать

я подумал о EventBus. Но мне придется передать данные из фрагмента ведущему. Теперь я зову UserData.getInstance() внутри присутствует и извлекает данные. Я хочу, чтобы код был более элегантным и правильным. Я прошу услышать мнение более опытных разработчиков, что лучше использовать.

5 ответов


Я бы сделал это способом ModellViewPresenter

class CustomerModel {
    String phoneNumber
}

interface ICustomerOwner {
    CustomerModel getCustomer()
}

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner {
    CustomerModel getCustomer()
    ...
}

class CustomerContactDataFragment // fragment1 where you edit the phone number.

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button)

поскольку модель живет в активности (CustomerRegistrationWorkflow), фрагменты могут взаимодействовать с моделью, позвонив

((ICustomerOwner) getActivity()).getCustomer()

существует так много способов отправки данных из одного класса (фрагментов) в другой.

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

class FragmentA {
    Bus bus;

    onCreate(){
      bus = new Bus();
    }

    @Subscribe public void receiveMessage(String message) {
       // TODO: Parse your message
    }

    onResume(){
      bus.register(this);
    }

    onPause(){
      bus.unregister(this);
    }
}

class FragmentB {

    onCreate(){
      bus.post("You have a message");
    }
}

подробнее об интеграции otto здесь. Или есть много других вариантов. https://greenrobot.github.io/EventBus/


один вызывает элегантное решение с помощью шины событий, другой - старые хорошие обратные вызовы. Моя точка зрения состоит в том, чтобы избежать ситуации "цепочки фрагментов" - когда один фрагмент напрямую вызывает другой. Если activity полностью обрабатывает замену фрагментов, она имеет равный доступ ко всем 5 фрагментам. Поэтому он может легко передавать данные между ними, используя обратные вызовы.

не вижу никаких проблем с MVP в этом случае. Presenter использует обратный вызов для отправки данных в свое представление (фрагмент). Фрагмент использовать обратный вызов для отправки данные о его деятельности. Затем найдите 5-й фрагмент в диспетчере фрагментов и обновите/передайте данные в 5-м фрагменте.

ситуация с обратным вызовом кажется более надежной, чем шина событий, но все же дело вкуса.


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

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

теперь, чтобы передать данные из одного фрагмента в другой, вы можете создать метод в действии и сохранить некоторые данные в переменной через этот метод. И в другом фрагменте вы можете получить доступ к значению этой переменной с помощью другого метода. Здесь можно использовать концепцию методов getter и setter.

для получения дополнительной информации о деятельности и связи фрагмента, посетите ссылку: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity


у меня было много проблем с передачей данных в acitvity или fragment взаимно. В результате я сделал DataCache передать любой объект в любом месте.

это очень простой пример. Gihub: Android DataCache

фрагмент для отправителя

public class FragmentA {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String msg = "the phone number"
        DataCache.getInstance().push(msg);
    }
}

фрагмент для приемника

public class FragmentB {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            String msg = DataCache.getInstance().pop(String.class);
        }
    }

попробуйте: D Я надеюсь, что вы поможете.