5

Проблема следующая. У нас есть 3 вкладки с фрагментами:Связь между различными экземплярами одного и того же фрагмента

  • Вкладка 1 (фрагмент А). Необходимо отправить данные на вкладку 2.
  • Вкладка 2 (фрагмент B). Требуется получить данные из Таб. 1.
  • Вкладка 3 (фрагмент B). Уже содержит данные.

Как вы видите, Tab 3 и Tab 2 содержат один и тот же фрагмент, но разные экземпляры.

Как отправить данные (не через аргументы) точно в Tab 2?

Что я пробовал:

  1. Установите уникальный идентификатор фрагмента B через аргументы, когда они были созданы.
  2. Регистр же Local Broadcast Receiver для обоих случаев фрагмента B
  3. Отправить данные из фрагмента A фрагменту B с ID
  4. В Фрагмент B onReceive() проверки, если Recevied ID равен ID фрагмента

Но, к сожалению трансляции был отправлен только на Tab 3.


EDIT: еще немного информации.

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

+0

Почему вы не позволяете фрагменту A отправлять данные в свою деятельность, и позволяет вам передавать вам фрагмент B? –

+0

Вы видите, что нет никаких проблем при отправке данных. Проблема заключается в отправке данных ТОЧНО в первый экземпляр фрагмента B – AnZ

+0

Я думаю, что BroadcastReceiver занимает слишком много памяти и представляет собой асинхронный процесс, который, как я думаю, вам не нужен. И у него есть проблемы с безопасностью. –

ответ

5

Являются ли фрагменты размещены в одном мероприятии? Затем вы можете реализовать интерфейс для своей деятельности хостинга.

YourActivity implements MyInterface { 
... 
} 

И в ваших фрагментов вы определяете это:

@Override 
public void onAttach(final Activity context) { 
    myInterface = (MyInterface) context; 
} 

И когда вы нажимаете что-то в вашем фрагменте затем вызвать myInterface.doSomething(parameter);. И тогда ваша деятельность может делегировать другой фрагмент.

+0

Это правильный способ сделать это! – Skynet

+0

Спасибо за быстрый ответ. Эти фрагменты размещаются в одном фрагменте (потому что у меня есть NavigationDrawer с фрагментом, который содержит ViewPager с этими вкладками). Но в любом случае, у меня есть точка. Постараемся попробовать. – AnZ

+0

Извините за деинформацию, но похоже, что этот подход не работает для фрагментов, размещенных внутри фрагмента. Я получаю 'ClassCastException' в' OnAttach() '. Переход к вопросу редактирования – AnZ

6

Я предлагаю ввести EventBus в ваше приложение.

Чтобы добавить зависимость - добавьте compile 'de.greenrobot:eventbus:2.4.0' в свой список зависимостей.

Затем вы просто подписываете фрагмент третьей вкладки, чтобы прослушать событие из первого фрагмента.

Что-то вроде этого: в Фрагмент B

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    eventBus.register(this); 
} 

@Override 
public void onDetach() { 
    eventBus.unregister(this); 
    super.onDetach(); 
} 

@SuppressWarnings("unused") // invoked by EventBus 
public void onEventMainThread(NewDataEvent event) { 
    // Handle new data 
} 

NewDataEvent.Java

public class NewDataEvent extends EventBase { 
    public NewDataEvent() {} 
} 

И в Fragment А просто отправить событие:

protected EventBus eventBus; 
.... 
eventBus = EventBus.getDefault(); 
.... 
eventBus.post(new NewDataEvent()); 

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

+0

Event-Driven Development, да? Это интересный подход. Подойдите, чтобы попробовать. Спасибо! – AnZ

0

Вы не писали, как вы добавляете фрагменты во время выполнения или нет. Это будет лучше, чтобы добавить его во время выполнения и назначить метки для каждого фрагмента, например:

... 
fragmentTransaction.replace(R.id.layoutTab2, fragment, "F-B-2"); 
... 
fragmentTransaction.replace(R.id.layoutTab3, fragment, "F-B-3"); 
... 

так позже вы можете определить или найти фрагмент по его метке. Например:

FragmentManager.findFragmentByTag("F-B-2") 

или если вам нужен фрагмент B 3:

FragmentManager.findFragmentByTag("F-B-3") 

Надеется, что это поможет.

0

Вы можете использовать идею Bundle для передачи данных между фрагментами. Я вижу, что мое предложение об этой идее в предыдущем посте было неправильно понято. Вот пример кода, в котором фрагмент получает данные. FRAGMENT2:

public static Fragment2 newInstance(long param1, String param2) { 
    MediaFragment fragment = new Fragment2(); 
    Bundle args = new Bundle(); 

    args.putLong(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 

    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     Bundle bundle = getArguments(); 
     audioId = bundle.getLong(ARG_PARAM1); 
     audioName = bundle.getString(ARG_PARAM2); 
    } 
} 

На другом фрагменте или активности, вызывая FRAGMENT2:

Fragment2 recvfragment = Fragment2.newInstance(itemId, itemName); 

Примечания:

  • с узелками, вы можете передавать определенные типы данных с значений в различные экземпляры фрагмента, которые вам нужны.
  • В этом случае код передает длинный и строковый тип на Fragment2.
+0

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

+0

@AnZ. В моем примере вы можете передать определенное значение первому параметр в «newInstance (long param1 ...»). Какой бы фрагмент был вызывающим, основная активность может передавать значение фрагменту, тогда этот фрагмент может передать значение принимающему фрагменту. Это мой предпочтительный метод, поскольку он принимает меньше и ... Я старался внимательно прочитать ваше сообщение. –

0

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

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

+0

Данные транслируются во время выполнения и несколько раз. – AnZ

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

  • Нет связанных вопросов^_^