Estoy usando DialogFragments para varias cosas: elegir un elemento de la lista, ingresar texto.
¿Cuál es la mejor manera de devolver un valor (es decir, una cadena o un elemento de una lista) a la actividad / fragmento de llamada?
Actualmente estoy implementando la actividad de llamadas DismissListener
y le estoy dando al DialogFragment una referencia a la actividad. Luego, OnDimiss
el cuadro de diálogo llama al método en la actividad y la actividad toma el resultado del objeto DialogFragment. Muy desordenado y no funciona en el cambio de configuración (cambio de orientación) ya que DialogFragment pierde la referencia a la actividad.
Gracias por cualquier ayuda.
Activity
como elDialogFragment
podrían ser recreados. Usar elActivity
paso aonAttach(Activity activity)
es la forma correcta y recomendada.Respuestas:
Úselo
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
desde el lugar donde muestra el cuadro de diálogo, y luego cuando termine su cuadro de diálogo, desde allí puede llamargetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
e implementaronActivityResult()
en el fragmento que lo contiene.Parece un abuso de
onActivityResult()
, especialmente porque no involucra actividades en absoluto. Pero lo he visto recomendado por la gente oficial de Google, y tal vez incluso en las demostraciones de la API. Creo que es para lo queg/setTargetFragment()
se agregaron.fuente
Como puede ver aquí, hay una manera muy simple de hacerlo.
En su
DialogFragment
agregar un oyente de interfaz como:Luego, agregue una referencia a ese oyente:
Esto se usará para "activar" los métodos de escucha, y también para verificar si la Actividad / Fragmento principal implementa esta interfaz (ver más abajo).
En el
Activity
/FragmentActivity
/Fragment
que "llamó"DialogFragment
simplemente implementan esta interfaz.En
DialogFragment
todo lo que necesita agregar en el punto donde desea descartarDialogFragment
y devolver el resultado es este:¿Dónde
mEditText.getText().toString()
está lo que se pasará de nuevo a la llamadaActivity
?Tenga en cuenta que si desea devolver algo más, simplemente cambie los argumentos que toma el oyente.
Finalmente, debe verificar si la interfaz fue implementada realmente por la actividad / fragmento principal:
Esta técnica es muy flexible y permite volver a llamar con el resultado incluso si aún no desea cerrar el diálogo.
fuente
Activity
'syFragmentActivity
' s pero si la persona que llama es unFragment
?Fragment
.Fragment
entonces, puede hacer algunas cosas: 1. Pase el fragmento como referencia (puede que no sea una buena idea porque podría causar pérdidas de memoria). 2. UseFragmentManager
y llamefindFragmentById
ofindFragmentByTag
obtendrá los fragmentos que existen en su actividad. Espero que haya ayudado. ¡Que tengas un gran día!setTargetFragment()
YgetTargetFragment()
son mágicos.Hay una forma mucho más simple de recibir un resultado de un DialogFragment.
Primero, en su Actividad, Fragmento o Fragmento de Actividad, necesita agregar la siguiente información:
El
requestCode
es básicamente la etiqueta int para el DialogFragment que llama, voy a mostrar cómo funciona esto en un segundo. ResultCode es el código que envía de regreso desde el DialogFragment que le dice a su Actividad, Fragmento o FragmentoActividad actual en espera lo que sucedió.El siguiente fragmento de código que debe ingresar es la llamada al DialogFragment. Un ejemplo está aquí:
Con estas tres líneas está declarando su DialogFragment, configurando un requestCode (que llamará a onActivityResult (...) una vez que se descarta el Diálogo, y luego está mostrando el diálogo. Es así de simple.
Ahora, en su DialogFragment solo necesita agregar una línea directamente antes de la
dismiss()
para que pueda enviar un resultCode de nuevo a onActivityResult ().Eso es. Tenga en cuenta que el resultCode se define como el
int resultCode
que he establecidoresultCode = 1;
en este caso.Eso es todo, ahora puede enviar el resultado de su DialogFragment a su Actividad de llamada, Fragmento o FragmentActivity.
Además, parece que esta información se publicó anteriormente, pero no hubo un ejemplo suficiente dado, así que pensé en proporcionar más detalles.
EDITAR 06.24.2016 Pido disculpas por el código engañoso anterior. Pero ciertamente no puede recibir el resultado de vuelta a la actividad como la línea:
establece un objetivo
Fragment
y noActivity
. Entonces, para hacer esto, debe usar Implementar unInterfaceCommunicator
.En su
DialogFragment
conjunto una variable globalCrear una función pública para manejarlo
Luego, cuando esté listo para enviar el código de nuevo
Activity
cuandoDialogFragment
termine de ejecutarse, simplemente agregue la línea antes dedismiss();
suDialogFragment
:En su actividad ahora tiene que hacer dos cosas, la primera es eliminar esa línea de código que ya no es aplicable:
Luego implemente la interfaz y ya está. Puede hacerlo agregando la siguiente línea a la
implements
cláusula en la parte superior de su clase:Y luego
@Override
la función en la actividad,Utiliza este método de interfaz como lo haría con el
onActivityResult()
método. Excepto que el método de interfaz es paraDialogFragments
y el otro es paraFragments
.fuente
dialogFrag.setTargetFragment(this, 1)
desde una Actividad, pero este método recibe un Fragmento como primer argumento, por lo que no se pudo lanzar. Estoy en lo cierto?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Bueno, es demasiado tarde para responder, pero esto es lo que hice para obtener resultados del
DialogFragment
. muy similar a la respuesta de @ brandon. Aquí estoy llamandoDialogFragment
desde un fragmento, simplemente coloque este código donde está llamando a su diálogo.donde
categoryDialog
es mi alDialogFragment
que quiero llamar y después de esto en su implementación dedialogfragment
colocar este código donde está configurando sus datos intencionalmente. El valor deresultCode
es 1 puede configurarlo o usar Definido por sistema.ahora es el momento de volver al fragmento de llamada e implementar este método. comprobar la validez de los datos o dar como resultado el éxito si se desea con
resultCode
yrequestCode
en caso de condiciones.fuente
Enfoque diferente, para permitir que un Fragment se comunique con su Actividad :
1) Defina una interfaz pública en el fragmento y cree una variable para él
2) Transmita la actividad a la variable mCallback en el fragmento
3) Implemente al oyente en su actividad
4) Anular OnFragmentInteraction en la actividad
Más información al respecto: https://developer.android.com/training/basics/fragments/communicating.html
fuente
public void onAttach
el fragmento y hacer la actividad de lanzamiento allíUna forma fácil que encontré fue la siguiente: Implemente este es su cuadro de diálogo Fragmento,
Y luego, en la actividad que llamó al Fragmento de Diálogo, cree la función apropiada como tal:
El brindis es para demostrar que funciona. Trabajó para mi.
fuente
Interface
lugar de acoplamiento duro con clases concretas.Estoy muy sorprendido al ver que nadie ha sugerido el uso de transmisiones locales para
DialogFragment
queActivity
la comunicación! Me parece mucho más simple y limpio que otras sugerencias. Esencialmente, se registra paraActivity
escuchar las transmisiones y envía las transmisiones locales desde susDialogFragment
instancias. Sencillo. Para obtener una guía paso a paso sobre cómo configurarlo todo, consulte aquí .fuente
O comparta ViewModel como se muestra aquí:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
fuente
En mi caso, necesitaba pasar argumentos a un targetFragment. Pero obtuve la excepción "Fragmento ya activo". Así que declaró una interfaz en mi DialogFragment que parentFragment implementó. Cuando parentFragment inició un DialogFragment, se estableció como TargetFragment. Luego en DialogFragment llamé
fuente
En kotlin
// Mi actividad
Espero que sirva, si puede mejorar, edítelo. Mi Inglés no es muy bueno
fuente
si desea enviar argumentos y recibir el resultado del segundo fragmento, puede usar Fragment.setArguments para realizar esta tarea
fuente
Solo para tenerlo como una de las opciones (ya que nadie lo mencionó aún): puede usar un autobús de eventos como Otto. Entonces en el diálogo que haces:
Y haga que su interlocutor (Actividad o Fragmento) se suscriba:
fuente