Android-getTargetFragment y setTargetFragment - Para qué se utilizan


Traté de buscar pero todavía estoy un poco perdido. Normalmente hago comunicación fragmento a fragmento a través de un Activity a 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 solo un ejemplo rápido para que pueda comprender su uso?

Author: Alexander Farber, 2013-09-01

3 answers

Caso de uso = 2 fragmentos alojados por la misma actividad.

Donde startActivityForResult() establece una relación entre 2 actividades, setTargetFragment() define la relación llamada/llamada entre 2 fragmentos.

setTargetFragment (target) permite que el fragmento "llamado" sepa 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)
 35
Author: kandinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-28 06:16:32

Finalmente descubrí cómo usar setTarget en un fragmento y quise compartirlo. es muy útil cuando quieres comunicarte de fragmento a fragmento.

Aquí hay un ejemplo: digamos que querías mostrar un diálogo y cuando se cierra quieres hacer alguna acción.

Así que en tu fragmento1 que usará el diálogo puedes hacer esto:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE);

Y en el fragmento que llamó al diálogo, tendría que anular onActivityResult de la siguiente manera:

 @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 el myDialogFragment usted podría 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 sigo prefiriendo bus de eventos ya que a veces después de enviar datos a un destino, su vista ya podría haber sido destruida (en caso de que sea un fragmento) y luego si intenta actualizar la vista en onActivityResult obtendrá un bloqueo. así que diría que es útil simplemente pasar datos pero no actualizar la interfaz de usuario a menos que haya hecho una transacción de fragmento 'agregar' y no una replace (que destruye la vista pero mantiene el estado).

 8
Author: j2emanue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-07 19:55:53

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 ejemplo que escribí que demuestra un solo caso de uso para usar estos métodos. Sin embargo, estoy seguro de que hay más casos de uso...

 4
Author: Alex Fu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-01 23:34:17