Datos de paso de Android entre Fragmentos
Tengo una Activity
y 5 Fragment
. En el primer usuario de Fragment
ingresa el número de teléfono. En el último (quinto) Fragment
necesito mostrar este número de teléfono, ingresar otros campos y enviar todos los datos al servidor. Para cada Fragment
estoy usando presentador independiente (MVP).
¿Cómo pasar los datos del primer fragmento a la última?
- Estructura del paquete de patrones de Android MVP
- En la estructura MVP, la clase responsable de mantener los elementos de la lista y la forma de notificar los cambios de datos en este
- MVP de Android: qué modelo presentar para ver
- Múltiples Actividades / Fragmentos y el Model View Presenter pattern
- Android Dagger 2 y MVP se inyectan dentro de un objeto inyectado
1) No quiero pasar por toda la cadena de fragmentos, porque no necesitan estos datos.
2) Si almacenar estos datos en la Activity
alojamiento de lo que necesito para llamar ((SomeActivity)getActivity()).getUserData()
dentro de la clase Fragment
y pasar estos datos a Presenter.
3) Elegí la última aproximación. He creado singleton UserData clase. Esto es simple POJO clase. Estoy creando la instancia de UserData
en el primer Fragment
conjunto de datos necesarios y que usarlo en el último Fragment
para recuperar los datos y agregar los campos que faltan.
Pero no sé es el enfoque con singleton solución correcta. Porque necesito despejar la instancia singleton cuando el usuario va a otra Activity
. Si hay mejor solución?
EDITAR
Pensé en EventBus. Pero tendré que pasar los datos del Fragmento al Presentador. Ahora llamo UserData.getInstance()
dentro de presentar y recuperar datos. Quiero que el código sea más elegante y también correcto. Estoy pidiendo escuchar la opinión de los desarrolladores más experimentados que mejor usar.
- ¿Cuál es la mejor manera de comprobar los permisos en tiempo de ejecución mediante la arquitectura MVP?
- Comprobación de Internet, dónde colocar al usar MVP, RX y Retrofit
- Daga con Android: ¿Cómo inyectar el contexto cuando se utiliza MVP?
- MVP, establecer la opinión del presentador de nulo en destruir?
- Cómo inyectar un presentador en una vista (patrón MVP) usando Dagger2
- MVP de Android con Dagger 2 - Actividad con múltiples fragmentos
- Google Analytics con el patrón de diseño MVP
- ¿Cómo usar las Preferencias Compartidas en MVP sin Dagger y no hacer que Presenter dependa del contexto?
Lo haría de la manera ModellViewPresenter
class CustomerModel { String phoneNumber } interface ICustomerOwner { CustomerModel getCustomer() } class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { CustomerModel getCustomer() ... } class CustomerContactDataFragment // fragment1 where you edit the phone number. class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button)
Dado que el modelo vive en la actividad (CustomerRegistrationWorkflow) los fragmentos podrían comunicarse con el modelo llamando
((ICustomerOwner) getActivity()).getCustomer()
Hay tantas maneras de enviar datos de una clase (Fragmentos también) a otro.
Considerando los problemas del ciclo de vida de Fragment. Puede utilizar un bus de eventos para el mismo sin ningún tipo de molestias.
class FragmentA { Bus bus; onCreate(){ bus = new Bus(); } @Subscribe public void receiveMessage(String message) { // TODO: Parse your message } onResume(){ bus.register(this); } onPause(){ bus.unregister(this); } } class FragmentB { onCreate(){ bus.post("You have a message"); } }
Más sobre la integración de otto aquí . O hay tantas otras opciones también. https://greenrobot.github.io/EventBus/
Uno llama la solución elegante usar el autobús del acontecimiento, el otro – viejo callbacks buenos. Mi punto de vista es evitar la situación de "cadena de fragmentos" – cuando un fragmento llama directamente a otro. Si la actividad maneja completamente el reemplazo de los fragmentos tiene acceso igual a todos los 5 fragmentos. Por lo tanto, puede pasar fácilmente los datos entre ellos utilizando devoluciones de llamada.
No vea ningún problema con MVP en ese caso. El presentador utiliza la devolución de llamada para enviar datos a su vista (Fragmento). Fragmento utiliza la devolución de llamada para enviar datos a su actividad. A continuación, la actividad encuentra el 5º fragmento en el gestor de fragmentos y los datos de actualización / paso en el 5º fragmento.
La situación con devolución de llamada parece más robusta que el bus de eventos, pero sigue siendo materia de gusto.
Un fragmento siempre está conectado a la Actividad que lo contiene. Por lo tanto, puede comunicarse con la actividad fácilmente. Usando su Actividad como un canal de comunicación o un medio de comunicación, puede crear un enlace de comunicación entre los Fragmentos adjuntos a la misma Actividad.
Un fragmento conectado a una Actividad puede acceder al método de la instancia de la Actividad por getActivity () y con esta instancia, el fragmento puede realizar tareas como los métodos de llamada de la Actividad.
Ahora, para transferir datos de un fragmento a otro, puede crear un método en la actividad y almacenar algunos datos en una variable a través de ese método. Y en el otro fragmento, puede acceder al valor de esa variable por ayuda de otro método. El concepto de métodos getter y setter puede ser usado aquí.
Para más información sobre la comunicación de Activity and Fragment, visite el enlace: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
He tenido un montón de problemas acerca de pasar los datos a la acitvidad o fragmento mutuamente. Como resultado, hice DataCache pasar cualquier objeto en cualquier lugar.
Este es el ejemplo super fácil. Gihub: Android DataCache
Fragmento para el remitente
public class FragmentA { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String msg = "the phone number" DataCache.getInstance().push(msg); } }
Fragmento para el receptor
public class FragmentB { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String msg = DataCache.getInstance().pop(String.class); } }
Intentarlo: DI espero que usted ayude.
Class ActivityClass { String phone_number; public void savePhoneNumber(String phone){ phone_number = phone; } public String getPhoneNumber(){ return phone; } } Class FragmentA { String phone; public setPhoneNumber(){ if(getActivity() instanceOf ActivityClass){ ((ActivityClass) getActivity).savePhoneNumber(phone); } } } Class FragmentB { String phone; public getPhoneNumber(){ if(getActivity() instanceOf ActivityClass){ phone = ((ActivityClass) getActivity).getPhoneNumber(); } } }
- Autenticador Android inicia la pantalla de inicio de sesión cuando no hay cuenta presente
- ListView con barra de progreso en cada elemento?