Андроид передача данных между фрагментами
у меня есть один 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 Я надеюсь, что вы поможете.