Comunicación entre un fragmento y una actividad – mejores prácticas

Esta pregunta es sobre todo para solicitar opiniones sobre la mejor manera de manejar mi aplicación. Tengo tres fragmentos que son manejados por una actividad. Fragmento A tiene un elemento clicable la foto y el fragmento B tiene 4 elementos clicables los botones. El otro fragmento sólo muestra detalles cuando se hace clic en la foto. Estoy utilizando ActionBarSherlock.

Captura de pantalla

Los botones de avance y retroceso necesitan cambiar la foto a las poses siguientes o anteriores, respectivamente. Podría mantener la foto y los botones en el mismo fragmento, pero quería mantenerlos separados por si quería reorganizarlos en una tableta.

Necesito un consejo – ¿debo combinar los fragmentos A y B? Si no, necesitaré calcular hacia fuera cómo implementar una interfaz para 3 artículos clickable.

Pensé en usar Roboguice, pero ya estoy extendiendo usando SherlockFragmentActivity por lo que es un no ir. Vi mención de Otto, pero no vi buenos tutoriales sobre cómo incluir en un proyecto. ¿Qué crees que debería ser la mejor práctica de diseño?

También necesito ayuda para averiguar cómo comunicarse entre un fragmento y una actividad. Me gustaría mantener algunos datos "globales" en la aplicación, como el id de pose. ¿Hay algún código de ejemplo que puedo ver además de la información del desarrollador android de stock? Eso no es tan útil.

BTW, ya estoy almacenando toda la información sobre cada pose en una base de datos SQLite. Esa es la parte fácil.

La forma más fácil de comunicarse entre su actividad y fragmentos es utilizando interfaces. La idea es básicamente definir una interfaz dentro de un fragmento A dado y dejar que la actividad implemente esa interfaz.

Una vez que ha implementado esa interfaz, podría hacer lo que quiera en el método que reemplaza.

La otra parte importante de la interfaz es que usted tiene que llamar al método abstracto de su fragmento y recuerde lanzarlo a su actividad. Debe atrapar una ClassCastException si no se hace correctamente.

Hay un buen tutorial sobre Simple Developer Blog sobre cómo hacer exactamente este tipo de cosas.

Espero que esto fue útil para usted!

El método sugerido para comunicarse entre fragmentos es usar callbacks \ listeners que son administrados por su Actividad principal.

Creo que el código de esta página es bastante claro: http://developer.android.com/training/basics/fragments/communicating.html

También puede hacer referencia a la aplicación IO 2012 Schedule, que está diseñada para ser una aplicación de referencia de facto. Se puede encontrar aquí: http://code.google.com/p/iosched/

También, aquí está una pregunta SO con buena información: Cómo pasar datos entre fragmentos

Se implementa por interfaz de llamada de retorno: En primer lugar tenemos que hacer una interfaz:

public interface UpdateFrag { public void updatefrag(); } 

En actividad, haga el siguiente código:

 UpdateFrag updatfrag ; public void updateApi(UpdateFrag listener) { updatfrag = listener; } 

Desde el evento desde el que la devolución de llamada tiene que disparar en actividad:

 updatfrag.updatefrag(); 

En Fragment implemente la interfaz en CreateView haga el siguiente código:

  ((Home)getActivity()).updateApi(new UpdateFrag() { @Override public void updatefrag() { .....your stuff...... } }); 

Hay varias maneras de comunicarse entre actividades, fragmentos, servicios, etc. La obvia es comunicarse usando interfaces. Sin embargo, no es una forma productiva de comunicarse. Tienes que implementar los oyentes, etc.

Mi sugerencia es usar un autobús de eventos. El bus de eventos es una implementación de patrón de publicación / suscripción.

Puedes suscribirte a eventos en tu actividad y luego puedes publicar esos eventos en tus fragmentos, etc.

Aquí en mi blog puede encontrar más detalles sobre este patrón y también un proyecto de ejemplo para mostrar el uso.

No estoy seguro de entender realmente lo que quieres hacer, pero la forma sugerida para comunicar entre fragmentos es usar devoluciones de llamada con la actividad, nunca directamente entre fragmentos. Vea aquí http://developer.android.com/training/basics/fragments/communicating.html

Puede crear declarar una interfaz pública con una declaración de función en el fragmento e implementar la interfaz en la actividad. Entonces puede llamar a la función del fragmento.

Estoy usando Intents para comunicar acciones de regreso a la actividad principal. La actividad principal es escucharlas mediante la superación deNewIntent (intención). La actividad principal traduce estas acciones a los fragmentos correspondientes por ejemplo.

Así que usted puede hacer algo como esto:

 public class MainActivity extends Activity { public static final String INTENT_ACTION_SHOW_FOO = "show_foo"; public static final String INTENT_ACTION_SHOW_BAR = "show_bar"; @Override protected void onNewIntent(Intent intent) { routeIntent(intent); } private void routeIntent(Intent intent) { String action = intent.getAction(); if (action != null) { switch (action) { case INTENT_ACTION_SHOW_FOO: // for example show the corresponding fragment loadFragment(FooFragment); break; case INTENT_ACTION_SHOW_BAR: loadFragment(BarFragment); break; } } } 

Luego dentro de cualquier fragmento para mostrar el fragmento foo:

 Intent intent = new Intent(context, MainActivity.class); intent.setAction(INTENT_ACTION_SHOW_FOO); // Prevent activity to be re-instantiated if it is already running. // Instead, the onNewEvent() is triggered intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); getContext().startActivity(intent); 

Hice una biblioteca de anotaciones que puede hacer el reparto para usted. mira esto. https://github.com/zeroarst/callbackfragment/

 @CallbackFragment public class MyFragment extends Fragment { @Callback interface FragmentCallback { void onClickButton(MyFragment fragment); } private FragmentCallback mCallback; @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt1 mCallback.onClickButton(this); break; case R.id.bt2 // Because we give mandatory = false so this might be null if not implemented by the host. if (mCallbackNotForce != null) mCallbackNotForce.onClickButton(this); break; } } } 

A continuación, genera una subclase de su fragmento. Y simplemente añádelo a FragmentManager.

 public class MainActivity extends AppCompatActivity implements MyFragment.FragmentCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction() .add(R.id.lo_fragm_container, MyFragmentCallbackable.create(), "MY_FRAGM") .commit(); } Toast mToast; @Override public void onClickButton(MyFragment fragment) { if (mToast != null) mToast.cancel(); mToast = Toast.makeText(this, "Callback from " + fragment.getTag(), Toast.LENGTH_SHORT); mToast.show(); } } 
  • excepción java.lang.NoClassDefFoundError en algunos dispositivos
  • No se puede hacer el DialogFragment personalizado transparente sobre el fragmento
  • Fragmento de inicio (en lugar de actividad) desde Android 7.1 App Shortcut
  • Diferencia entre Fragmento y FragmentoActividad
  • Fragmentos de Z-Layering en Android
  • Creación y uso de la vista de un fragmento aunque no sea visible para el usuario
  • Google Map lento después de mostrar un fragmento
  • Android: el paquete savedInstanceState es null en Fragment onCreate () y onCreateView ()
  • Cambiar la barra de herramientas con cambio de Fragmento como aplicación instagram
  • Algunos fragmentos se pierden en rotación
  • Cómo ir a la pestaña anterior seleccionada al presionar una barra de acción de acción atrás botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.