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

Resuelto Kristy Welsh asked hace 54 años • 11 respuestas

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.

Captura de pantalla

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.

Kristy Welsh avatar Jan 01 '70 08:01 Kristy Welsh
Aceptado

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!

Eenvincible avatar Aug 19 '2014 20:08 Eenvincible

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

Booger avatar Jan 09 '2013 23:01 Booger

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 CreateViewhaga el siguiente código:

 ((Home)getActivity()).updateApi(new UpdateFrag() {
        @Override
        public void updatefrag() {
              .....your stuff......
        }
 });
Jyoti avatar Sep 03 '2016 17:09 Jyoti

Para comunicarse entre an Activityy Fragments hay varias opciones, pero después de mucha lectura y muchas experiencias, descubrí que se puede resumir de esta manera:

  • Activityquiere comunicarse con el niño Fragment=> Simplemente escriba métodos públicos en su Fragmentclase y deje que Activitylos llame
  • Fragmentquiere comunicarse con el padre Activity=> 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 definir interfaceeso será implementado por el Activity, y que establecerá un contrato para cualquiera Activityque quiera comunicarse con ese Fragment. Por ejemplo, si tiene un FragmentA, que quiere comunicarse con cualquiera activityque lo incluya, entonces defina cuál FragmentAInterfacedefinirá qué método puede llamar FragmentApara el activitiesque decida usarlo.
  • A Fragmentquiere comunicarse con otro Fragment=> 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, FragmentAInterfaceque serán implementadas por FragmentBy FragmentAInterfaceque serán implementadas por FragmentA. Eso empezará a complicar las cosas. E imagínese si tiene algunos Fragmentcorreos electrónicos más en su lugar e incluso los padres activityquieren comunicarse con ellos. Bueno, este caso es un momento perfecto para establecer una relación compartida ViewModelentre los activityy sus fragment. Más información aquí https://developer.android.com/topic/libraries/architecture/viewmodel . Básicamente, necesita definir una SharedViewModelclase que tenga todos los datos que desea compartir entre ellos activityy los fragmentsque necesitarán comunicar datos entre ellos.

El ViewModelcaso 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( activitiesy fragments).

 avatar Aug 10 '2018 15:08