two - Android-getTargetFragment y setTargetFragment-¿Para qué se usan?
how to communicate 2 fragments (3)
Intenté buscar pero todavía estoy un poco perdido. Por lo general, fragmentar para fragmentar la comunicación a través de una Activity
través de interfaces o un BroadcastReceiver
.
De todos modos, mi pregunta es ¿cuál es el uso de getTargetFragment
? ¿Puede alguien proporcionar un caso de uso o simplemente un ejemplo rápido para que pueda comprender su uso?
De lo que pude sacar de la lectura de los documentos fue que estos métodos son otra forma de acceder a los datos de otro Fragmento. Aquí hay un proyecto de muestra que escribí que demuestra un caso de uso único para usar estos métodos. Estoy seguro de que hay más casos de uso, aunque ...
Use case = 2 fragmentos alojados por la misma actividad.
Donde startActivityForResult()
establece una relación entre 2 actividades, setTargetFragment()
define la relación llamador / llamada entre 2 fragmentos.
setTargetFragment (target) le permite al fragmento "llamado" saber dónde enviar el resultado. onActivityResult()
se llama manualmente en este caso.
public class Caller extends Fragment
Fragment called = Called.newInstance()
called.setTargetFragment(this)
public class Called extends DialogFragment
intent = amazingData
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)
finalmente descubrí cómo usar setTarget en un fragmento y quería compartir. es bastante útil cuando quieres comunicarte de fragmento a fragmento.
Aquí hay un ejemplo: digamos que quería mostrar un diálogo y cuando se cierra, quiere hacer algo.
entonces en tu fragmento1 que usará el diálogo podrías hacer esto:
myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE);
y en tu fragmento que llamó al diálogo, necesitarías anular en ActivityResult así:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == CoDDialogFragment.REQ_CODE)
exit(); //or whatever you want to do here
}
y en myDialogFragment puedes hacer esto:
TellTargetYouGotResults(REQ_CODE);
//...
private void TellTargetYouGotResults(int code) {
Fragment targetFragment = getTargetFragment(); // fragment1 in our case
if (targetFragment != null) {
targetFragment.onActivityResult(getTargetRequestCode(), code, null);
}
}
donde REQ_CODE puede ser cualquier int por supuesto. Muy útil para la comunicación fragmento a fragmento. pero aún prefiero el bus de eventos, ya que a veces, después de enviar datos a un objetivo, su vista ya pudo haber sido destruida (en caso de que sea un fragmento) y luego, si intentas actualizar la vista en onActivityResult, se producirá un bloqueo. así que diría que es útil simplemente pasar los datos pero no actualizar la UI a menos que hayas hecho una transacción de fragmento ''agregar'' y no un reemplazo (que destruye la vista pero mantiene el estado).