Comunicarse entre diferentes instancias del mismo fragmento

El problema de la siguiente manera. Vamos a tener 3 pestañas con fragmentos:

  • Ficha 1 (Fragmento A). Necesita enviar datos a la pestaña 2.
  • Ficha 2 (Fragmento B). Necesita recibir datos de la pestaña 1.
  • Ficha 3 (Fragmento B). Ya contiene datos.

Como ves Tab 3 y Tab 2 contienen el mismo Fragmento pero diferentes instancias.

¿Cómo puedo enviar datos (no a través de argumentos) exactamente a la pestaña 2?

Lo que he intentado:

  1. Establezca el identificador único para el fragmento B a través de argumentos cuando se crearon.
  2. Registre el mismo Local Broadcast Receiver para ambas instancias del fragmento B
  3. Enviar datos del fragmento A al fragmento B con su ID
  4. En el fragmento B onReceive() comprueba si la ID recevied es igual a ID del fragmento

Pero por desgracia, la transmisión sólo se envió a la pestaña 3.


EDIT: más información.

Esas fichas están alojadas dentro de otro fragmento con ViewPager . Esto se debe a la combinación de NavigationDrawer que tiene un fragmento con ViewPager y Tabs mencionados en la pregunta.

Sugiero introducir EventBus en tu aplicación.

Para añadir dependencia – agregue la compile 'de.greenrobot:eventbus:2.4.0' a su lista de dependencias.

A continuación, acaba de suscribir el fragmento de su tercera pestaña para escuchar el evento del primer fragmento.

Algo así: en el fragmento 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() {} } 

Y en el fragmento A acaba de enviar el evento:

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

(Y para evitar el manejo de eventos en la 2ª pestaña – solo pase el parámetro extra durante la instanciación del fragmento, si tiene que escuchar el evento)

¿Están los fragmentos alojados en una actividad? A continuación, podría implementar una interfaz en su actividad de alojamiento.

 YourActivity implements MyInterface { ... } 

Y en sus fragmentos usted define esto:

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

Y cuando haces clic en algo en tu fragmento, entonces llama a myInterface.doSomething(parameter); . Y luego su actividad puede delegar a otro fragmento.

No escribiste cómo agregas fragmentos, en tiempo de ejecución o no. Será mejor añadirlo durante el tiempo de ejecución y asignar TAG a cada fragmento, como esto:

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

Para que más tarde puedas identificar o encontrar fragmentos por su etiqueta. Por ejemplo:

 FragmentManager.findFragmentByTag("FB-2") 

O si necesita fragmento B 3:

 FragmentManager.findFragmentByTag("FB-3") 

Espero que ayude.

Puede utilizar la idea de Bundle para pasar datos entre Fragmentos. Puedo ver que mi sugerencia de esta idea en un post anterior fue malinterpretada. Aquí está el código de ejemplo donde el fragmento recibe los datos. Fragmento2 :

 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); } } 

En otro fragmento o actividad, llamar Fragmento2 :

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

Notas:

  • Con Bundles, puede pasar tipos de datos específicos con los valores en diferentes instancias del Fragmento, que necesita.
  • En este caso, el código pasa un tipo Long y String en Fragment2 .

Si está pasando del Fragmento A al Fragmento B, simplemente puede pasar valores al constructor del fragmento B.

O bien, si necesita el mismo conjunto de datos para ser utilizado en los tres fragmentos, también puede utilizar las preferencias de compartir.

  • Actualizar / Recargar / Re instanciar un fragmento en un sistema de pestañas android
  • Cómo actualizar el contenido de la ficha de fragmento en el botón de clic
  • Barra de Acción Sherlock con botones
  • Android 5.0 tablas de diseño de materiales
  • Android ICS + ActionBar Tabs + Cambio de orientación
  • Fragmento del buscapersonas que se oculta detrás de Tab Bar
  • Android: cómo crear una aplicación de pestañas compleja con vistas
  • ¿Cómo obtener una lista de entradas de fragmentos backstack en android?
  • Androide; Fragmentos se superponen al cambiar las pestañas
  • Fragmentos dentro de las pestañas del fragmento
  • Crash en MediaController.show ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.