Mejores Prácticas de Android – Comunicación entre Actividad y Fragmentos
Espero que ustedes puedan aclarar algo para mí.
He estado usando Android por cerca de 6 meses ahora y todavía estoy confundido sobre la mejor manera de comunicar entre la actividad y los fragmentos. Ya he leído la información en el sitio de desarrolladores de android .
- Honeycomb Android emulador es perro lento - se manejará antes del lanzamiento oficial?
- Android - ¿Cómo puedo medir el rendimiento de ListView y otras vistas?
- Para eventos de Android, ¿por qué las sentencias switch son más comunes que if-else?
- ¿Qué capacidades de eliminación automática de overdraw Android proporciona?
- Optimización de AndEngine juego
Fragmento de la actividad
En este momento sé con 100% de certeza absoluta que una interfaz es la mejor manera de comunicarse desde el Fragmento a la Actividad. Es decir, crear una interfaz en tu Fragmento y dejar que tu Actividad la implemente. De esta manera puede llamar al método desde su interfaz dentro de su Fragmento y hacer que sea manejado por la Actividad (que implementa la interfaz).
Actividad a Fragmento
He aquí que no estoy seguro. El sitio de desarrolladores de android dice que para comunicarse con un fragmento tienes que poner tus objetos en un paquete.
Bundle bundle = new Bundle(); bundle.putInt(SOME_IDENTIFIER, myInt);
Ahora he sido saben utilizar una clase Singleton de vez en cuando cuando tengo bastante alguna funcionalidad que puedo separar. Digamos que tengo un singleton llamado PersistenceService
donde manejo todas las cosas relacionadas con la persistencia, por ejemplo, guardar algo en SharedPreferences
. El PersistenceService
mantendrá métodos como putMyString(String key, String myString)
o putSomeObject(String key, SomeObject someObj)
. De esta manera, una clase no tiene que manejar la persistencia en sí, sino que simplemente puede llamar al PersistenceService
para hacerlo.
Ahora digo que tengo que actualizar algo en mi Fragmento, un TextView o algo así. Esto es lo que hago:
String myString = PersistenceService.getInstance(getActivity()).getMyString(someKey); textView.setText(myString);
Paso en un contexto ( getActivity()
) porque lo necesito para obtener las SharedPreferences
.
Ahora mi pregunta real es:
¿Puedo recuperar mis datos en la actividad y pasarla al fragmento deseado a través de su paquete? ¿O simplemente hago referencia a mi derecho Singleton en mi Fragmento y acceder a los datos allí directamente.
No estoy atrapado ni nada, pero me gustaría saber lo que ustedes recomendarían. Cualquier consejo, observaciones, información, etc es muy apreciado.
- Problema con la cámara personalizada de Android en algunos dispositivos
- Práctica recomendada para mantener los datos en la memoria y la base de datos al mismo tiempo en Android
- Obtención de datos pesados lanza Ventana de cursor: La ventana está llena de error
- ¿Cómo probar la función de sincronización de ejecución en android?
- Explicitamente liberando Mat con opencv 2.0
- Anulación de variables de Fragmento on onDestroy ()
- Cuenta de simulacro en ActivityInstrumentationTestCase2
- Es posible hacer SpeechRecognizer más rápido?
Esta es una pregunta muy amplia, y como dice el libro pragmático de pensamiento y aprendizaje, la respuesta a la mayoría de las preguntas en el software es "¡Todo depende!".
Y realmente lo hace, realmente todo depende, no hay regla dura en el software, "siempre" y "nunca" son palabras muy poderosas que no deben usarse en software, por lo que, diciendo siempre ir para "Bundle" info o Never go para un Singleton es un poco estúpido específicamente en el software, así que, en lugar de decirle exactamente qué usar, pregúntese qué es lo que mejor encaja en sus necesidades teniendo en cuenta cosas como, escalabilidad, capacidad de gestión de extensibilidad, etc. Por ejemplo:
Si usted va para Bundle, le da cierta flexibilidad a su fragmento, usted está creando algún tipo de componente independiente listo para trabajar con cualquier información que proporcione, por otro lado, si usted sabe que necesita ese fragmento sólo en ese lugar, y la información que pasará es de alguna manera compleja (no se puede pasar con un paquete), ¿por qué complicar tanto? Simplemente vaya para el Singleton si hace el trabajo simple y limpio.
Espero que mi punto esté bien explicado aquí, no hay reglas duras de una manera u otra, ser tan diligente como sea posible y no ir de una u otra manera sólo por pereza o negligencia, en lugar de ser analista si vale la pena ir de una manera u otro basado en sus necesidades, y siempre tener en cuenta que no porque fuiste de esa manera esta vez será cierto para todos sus escenarios.
¡Espero eso ayude!
¡Saludos!
Yo uso bundle cuando quiero enviar datos de fragmento a fragmento (de un fragmento a la actividad por interfaz, de la actividad a un fragmento por paquete).
Si los datos se usan en todos los fragmentos singleton es la mejor manera, alguna vez uso también una istancia de datos objcet en actividad que manipulo en fragmento por métodos públicos de actividad pero no creo que sea la mejor práctica.
Por favor, entiendan que 2 fragmentos no pueden comunicarse directamente entre sí, Necesitarán ayuda de la actividad bajo el contexto del cual se crean. Usando una interfaz :). Implementar la interfaz en un fragmento
interfaz StartCommunication
Defina la interfaz en la actividad cuyo fragmento de contexto está utilizando
public class MainActivity extends Activity implements SendFragment.StartCommunication