2012-03-07 22 views
23

Sé que cuando crea un fragmento por primera vez puede pasar argumentos usando setArguments(Bundle) y recuperarlos en el fragmento usando .¿Es posible pasar argumentos a un fragmento después de que se haya agregado a una actividad?

Sin embargo, en mi aplicación tengo fragmentos que se separarán y adjuntarán varias veces después de que se hayan agregado a una actividad. Al volver a conectar, es posible que necesite pasar un fragmento y un argumento para modificar su contenido antes de volver a conectarlo. Puedo usar setArguments la primera vez que visualizo el fragmento, pero en ocasiones posteriores eso no funcionará. El savedInstanceState no funcionará en este caso, ya que no sabré el valor del argumento antes de separar el fragmento.

Sé que podría implementar un método que yo llamaría antes de adjuntar el fragmento que establecería un argumento, pero parece que esto es algo que podría estar ya en la API y no lo estoy viendo.

¿Hay algo incorporado que me permita hacer esto, o tendré que implementar esto por mi cuenta? Para el registro, estoy usando el paquete de soporte (v4).

¡Muchas gracias!

+0

¿Qué quiere decir con reacoplar? Los fragmentos se adjuntarán a una actividad solo una vez (AFAIK) y si se separa de la actividad se destruye. ¿Quiere decir que cuando el usuario pulsa el botón Atrás, el fragmento vuelve al diseño? – 500865

Respuesta

12

Puede exponer un método en su fragmento que establezca lo que quiera pasarle. Para llamarlo, puedes, por ejemplo, recupera el fragmento del backstack por etiqueta o guarda una referencia de instancia desde donde sea que la estés llamando.

Esto funciona muy bien para mí, aunque debe estar a la defensiva en términos de controles nulos y conscientes del ciclo de vida de su fragmento cuando lo conecta o lo reinicia.

De lo que puedo decir que no hay nada en la API ...

Actualización: Esto sigue siendo cierto y funciona muy bien. Descubrí que una vez que esto es más complejo, es mucho más limpio y fácil usar algo como el Otto eventbus. Muy recomendable.

+0

El argumento que estoy transmitiendo es bastante trivial; no se trata de contenido que se va a agregar al fragmento, pero el fragmento mostrará/ocultará el contenido en función de su valor. Parecía casi un poco demasiado directo, lo que me hizo pensar que tal vez había una API para lo que estaba haciendo. Adivina no. ¡Gracias por la ayuda! –

2

¿Es posible pasar argumentos a un fragmento después de que se haya agregado a una actividad?


Pero si usted está buscando maneras de comunicarse con la actividad a la que está ligado un fragmento, puede hacerlo de la manera @manfred ha mencionado u otras formas descritas en el Documentation

Hay otra manera interesante de tener 2 fragmentos que se comunican entre sí. Esto es mediante el uso de los métodos setTargetFragment y getTargetFragment. Aquí, si fragmentB puede afectar fragmentA, se quiere setTargetFragment de fragmentB a fragmentA y cuando necesita ser actualizado a fragmentA desde el interior fragmentB los cambios, obtendrá una referencia a él por ((fragmentA) getTargetFragment()) y acceder al método de fragmentA para actualizarlo.

Espero que ayude. Buena suerte.

+0

él no está preguntando sobre la comunicación con fragmento, él está preguntando cómo cambiar los argumentos una vez configurados en el fragmento –

+0

Su "no" es muy engañoso e incorrecto, la respuesta a la pregunta OPs, que también citó, es respondida perfectamente por @ user3978046 arriba –

19

Sí, si ha llamado a setArguments (paquete) antes de que su fragmento se active. Luego, su fragmento a partir de ahí tiene un paquete que puede actualizar.Para evitar su problema, debe actualizar el paquete original y no debe invocar setArguments por segunda vez. Así que después de su construcción inicial de fragmentos, modificar los argumentos de los fragmentos con un código como

frg.getArguments().putString("someKey", "someValue"); 

Los argumentos luego estará disponible en su fragmento y será mantenido y restaurado durante los cambios de orientación y tal.

Tenga en cuenta que este método también es útil cuando el fragmento se está creando mediante xml en un diseño. Por lo general, uno no podría establecer argumentos sobre tal fragmento; la manera de evitar esta restricción es crear un constructor sin argumentos que crea el argumento paquete de este modo:

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

tarde en algún lugar en el método onCreate de su actividad usted entonces hacer:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

Esto coloca los datos en el paquete de argumentos, que luego estará disponible para codificar en su fragmento.

+0

Ya, pero ¿hay alguna manera de que su fragmento advierta que agregó argumentos al paquete? Supongo que podría agregar los argumentos y luego exponer un método en el fragmento al que la actividad puede llamar para obligarlo a volver a verificar los argumentos. El problema con eso es que la actividad no sabe en qué etapa del ciclo de vida se encuentra el fragmento. – Glaucus

Cuestiones relacionadas