Comunicación entre un fragmento y una actividad: mejores prácticas
Esta pregunta es principalmente para solicitar opiniones sobre la mejor manera de manejar mi aplicación. Tengo tres fragmentos manejados por una actividad. El fragmento A tiene un elemento en el que se puede hacer clic, la foto, y el fragmento B tiene 4 elementos en los que se puede hacer clic, los botones. El otro fragmento simplemente muestra detalles cuando se hace clic en la foto. Estoy usando ActionBarSherlock.
Los botones de avance y retroceso deben cambiar la foto a la pose siguiente o anterior, respectivamente. Podía mantener la foto y los botones en el mismo fragmento, pero quería mantenerlos separados en caso de que quisiera reorganizarlos en una tableta.
Necesito un consejo: ¿debería combinar los fragmentos A y B? De lo contrario, tendré que descubrir cómo implementar una interfaz para 3 elementos en los que se puede hacer clic.
Consideré usar Roboguice, pero ya estoy ampliando el uso de SherlockFragmentActivity, así que no es posible. Vi una mención de Otto, pero no vi buenos tutoriales sobre cómo incluirlos en un proyecto. ¿Cuál crees que deberían ser las mejores prácticas de diseño?
También necesito ayuda para descubrir cómo comunicarme entre un fragmento y una actividad. Me gustaría mantener algunos datos "globales" en la aplicación, como la identificación de la pose. ¿Hay algún código de ejemplo que pueda ver además de la información del desarrollador de Android? Eso no es tan útil.
Por cierto, 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 sencilla de comunicarse entre su actividad y los fragmentos es mediante interfaces. La idea es básicamente definir una interfaz dentro de un fragmento A determinado y dejar que la actividad implemente esa interfaz.
Una vez que haya implementado esa interfaz, podrá hacer lo que quiera en el método que anula.
La otra parte importante de la interfaz es que debes llamar al método abstracto desde tu fragmento y recordar enviarlo a tu actividad. Debería detectar una ClassCastException si no se hace correctamente.
Hay un buen tutorial en Simple Developer Blog sobre cómo hacer exactamente este tipo de cosas.
¡Espero que esto te haya sido útil!
El método sugerido para comunicarse entre fragmentos es utilizar devoluciones de llamada/oyentes 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/
Además, aquí hay una pregunta SO con buena información: Cómo pasar datos entre fragmentos
Se implementa mediante una interfaz de devolución de llamada:
Primero que nada, tenemos que hacer una interfaz:
public interface UpdateFrag {
void updatefrag();
}
En la Actividad haga el siguiente código:
UpdateFrag updatfrag ;
public void updateApi(UpdateFrag listener) {
updatfrag = listener;
}
desde el evento desde donde se debe activar la devolución de llamada en la Actividad:
updatfrag.updatefrag();
En el Fragmento implemente la interfaz y
CreateView
haga el siguiente código:
((Home)getActivity()).updateApi(new UpdateFrag() {
@Override
public void updatefrag() {
.....your stuff......
}
});
Para comunicarse entre an Activity
y Fragment
s hay varias opciones, pero después de mucha lectura y muchas experiencias, descubrí que se puede resumir de esta manera:
Activity
quiere comunicarse con el niñoFragment
=> Simplemente escriba métodos públicos en suFragment
clase y deje queActivity
los llameFragment
quiere comunicarse con el padreActivity
=> Esto requiere un poco más de trabajo, como sugiere el enlace oficial de Android https://developer.android.com/training/basics/fragments/communicating , sería una gran idea definirinterface
eso será implementado por elActivity
, y que establecerá un contrato para cualquieraActivity
que quiera comunicarse con eseFragment
. Por ejemplo, si tiene unFragmentA
, que quiere comunicarse con cualquieraactivity
que lo incluya, entonces defina cuálFragmentAInterface
definirá qué método puede llamarFragmentA
para elactivities
que decida usarlo.- A
Fragment
quiere comunicarse con otroFragment
=> Este es el caso en el que se produce la situación más "complicada". Dado que es posible que necesite pasar datos de FragmentA a FragmentB y viceversa, eso podría llevarnos a definir 2 interfaces,FragmentAInterface
que serán implementadas porFragmentB
yFragmentAInterface
que serán implementadas porFragmentA
. Eso empezará a complicar las cosas. E imagínese si tiene algunosFragment
correos electrónicos más en su lugar e incluso los padresactivity
quieren comunicarse con ellos. Bueno, este caso es un momento perfecto para establecer una relación compartidaViewModel
entre losactivity
y susfragment
. Más información aquí https://developer.android.com/topic/libraries/architecture/viewmodel . Básicamente, necesita definir unaSharedViewModel
clase que tenga todos los datos que desea compartir entre ellosactivity
y losfragments
que necesitarán comunicar datos entre ellos.
El ViewModel
caso hace que las cosas sean bastante más simples al final, ya que no es necesario agregar lógica adicional que ensucie y ensucie el código. Además, le permitirá separar la recopilación (a través de llamadas a una base de datos SQLite o una API) de datos de Controller
( activities
y fragments
).