android - parametros - pasar variables a un fragment
¿Es posible pasar argumentos a un fragmento después de que se haya agregado a una actividad? (3)
¿Es posible pasar argumentos a un fragmento después de que se haya agregado a una actividad?
No.
Pero si busca formas de comunicarse con la actividad a la que está vinculado un fragmento, puede hacerlo de la forma en que @manfred lo ha mencionado u otras formas descritas en la Documentation
Hay otra forma 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
, establecerásTargetFragment de fragmentB
en fragmentA
y cuando los cambios necesiten actualizarse a fragmentA
desde dentro de fragmentB
, obtendrás una referencia a él por ((fragmentA) getTargetFragment())
y accederás al método de fragmentA
para actualizarlo.
Espero eso ayude. Buena suerte.
Sé que cuando estás instanciando por primera vez un fragmento puedes pasar argumentos usando setArguments(Bundle)
y recuperarlos en el fragmento usando getArguments()
.
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á. 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!
Puede exponer un método en su fragmento que establezca lo que quiera pasarle. Para llamarlo, puedes, por ejemplo, recuperar el fragmento del backstack por etiqueta o mantener una referencia de instancia desde donde sea que lo llames.
Esto funciona bien para mí, aunque debes estar a la defensiva en términos de controles nulos y conscientes del ciclo de vida de tu fragmento cuando lo adjuntas o lo reinicias.
Por lo que puedo decir, no hay nada en la API ...
Actualización: Esto sigue siendo cierto y funciona 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.
Sí, si ha llamado a setArguments (bundle) 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. Entonces, siguiendo la construcción de tu fragmento inicial, modifica los argumentos del fragmento con código como
frg.getArguments().putString("someKey", "someValue");
Los argumentos estarán entonces disponibles en su fragmento y se conservarán y restaurarán durante los cambios de orientación y demás.
Tenga en cuenta que este método también es útil cuando el fragmento se está creando a través de xml en un diseño. Por lo general, uno no podría establecer argumentos sobre tal fragmento; la forma de evitar esta restricción es crear un constructor sin argumentos que cree el paquete de argumentos de la siguiente manera:
public MyFragment() {
this.setArguments(new Bundle());
}
Más adelante, en algún lugar del método onCreate de tu actividad, harías lo siguiente:
FragmentManager mgr = this.getSupportFragmentManager();
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment);
Bundle bdl = frg.getArguments();
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData);
Esto coloca datos en el paquete de argumentos, que luego estará disponible para codificar en su fragmento.