4

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

Я не хочу, чтобы передавать данные между фрагментами с использованием активности, как это: Communicating with Other Fragments

Ниже мой сценарий:

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

Я просмотрел: Event Bus, но не получил рабочий пример для фрагментов.

Есть ли другая альтернатива для передачи данных между фрагментами?

Любая помощь будет оценена по достоинству.

Edited согласно ответу InnocentKiller в:

В FragmentOne я реализовал:

FragmentTwo = new FragmentTwo(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("Hello", "My name is Siddharth"); 
    fragment.setArguments(bundle); 

В FragmentTwo я реализовал:

Bundle bundle = this.getArguments(); 
    String myInt = bundle.getString("Hello","Test"); 
    mStartTripButton.setText(myInt); 
+0

Без активности Как вы можете управлять фрагментом? –

+0

Вы можете использовать Синглтон/статическую переменную – Suvitruf

+0

@M D: В моем родительском фрагменте у меня есть файл макета, который имеет два фрагмента. Мой родительский фрагмент вызывается, когда я нажимаю на навигационный ящик. И мой навигационный ящик является основным видом деятельности. –

ответ

3

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

Используйте комплект, поэтому напишите ниже код в первом фрагменте, откуда вы хотите отправить данные.

Fragment fragment = new Fragment(); 
Bundle bundle = new Bundle(); 
bundle.putString("message", "From Activity"); 
fragment.setArguments(bundle); 

и получить эти данные, используйте следующий код в другом фрагменте

String strtext=getArguments().getString("message"); 
+0

Это решение звучит хорошо .. давайте попробуем и дадим вам знать .. Спасибо –

+1

Я получаю пакет как null. –

+1

Может быть, значение, которое вы передаете, равно null или может быть другой проблемой. Не могу ничего сказать, не видя свой код. – InnocentKiller

15

Лучший способ обмена данными между активностью/фрагментами, фрагмент/фрагмент /, активность/активность, класс/класс , сделать общий класс одноплодной как:

public class DataHolderClass { 
private static DataHolderClass dataObject = null; 

private DataHolderClass() { 
    // left blank intentionally 
} 

public static DataHolderClass getInstance() { 
    if (dataObject == null) 
     dataObject = new DataHolderClass(); 
    return dataObject; 
} 
private String distributor_id;; 

public String getDistributor_id() { 
    return distributor_id; 
} 

public void setDistributor_id(String distributor_id) { 
    this.distributor_id = distributor_id; 
} 
} 

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

DataHolderClass.getInstance().setDistributor_id("your data"); 

теперь получить в любом месте (фрагмент, активность, класс)

String _data = DataHolderClass.getInstance().getDistributor_id(); 
+0

Насколько надежным этот метод? Насколько я знаю, нет никакой гарантии, что статический var сохранит свою ценность. Выглядит очень удобно. – jdkraftz

+0

@jdkraftz Я не выкопал ссылку, но я на 99% уверен, что статическая переменная сохраняется во время жизненного цикла приложения. По крайней мере, я использовал этот подход в приложении, которое непрерывно используется 8 часов в день и до сих пор не было проблем. – cYrixmorten

8

Вы можете использовать EventBus https://github.com/greenrobot/EventBus пройти любой сложный объект вокруг в Android.

Пример передачи объекта от одной деятельности к другой:

Добавьте свой объект на EventBus:

EventBus.getDefault().postSticky(anyObject); 
startActivity(new Intent(getActivity(), SomeActivity.class)); 

Anywhere в SomeActivity:

AnyObject anyObject = EventBus.getDefault().getStickyEvent(AnyObject.class); 

Это нелогич- просто показать, что он работает через Activities, вы можете позвонить getStickyEvent, чтобы получить anyObject в любом месте вашего кода.

Итак, вы можете опубликовать объект в фрагменте A и использовать getStickyEvent в фрагменте B для его получения.

Это особенно удобно, если у вас много аргументов и/или сложных объектов, которые вы хотите переместить из одного места в другое. Просто создайте один объект «держатель», содержащий геттер/сеттеры для аргументов, а затем передайте его. Гораздо проще, чем передавать их отдельно и как-то сериализовывать сложные объекты.

+0

+1 для общедоступной библиотеки. Но для этой задачи это немного тяжело. Создание собственного держателя данных легче. –

+1

@SubinSebastian Вы правы, на самом деле недавно перешли во временные статические держатели во многих случаях. EventBus хотя и предлагает другие очень приятные функции, такие как вещание сложных объектов. Внезапно легко, например, обновить пользовательский интерфейс на основе событий службы. Даже если вы хотите сообщить нетривиальные данные. – cYrixmorten

+0

плюс это совсем не подходит для этого! Вы не можете передавать данные из фрагмента в другой, не затрагивая активность хоста, которая неудобна! –

Смежные вопросы