web-dev-qa-db-fra.com

Android - getTargetFragment et setTargetFragment - À quoi servent-ils

J'ai essayé de chercher mais je suis encore un peu perdu. Je fais habituellement des fragments pour fragmenter la communication via un Activity via des interfaces ou un BroadcastReceiver.

Quoi qu'il en soit, ma question est à quoi sert getTargetFragment? Quelqu'un peut-il fournir un cas d'utilisation ou juste un exemple rapide pour que je puisse comprendre son utilisation?

34
j2emanue

Cas d'utilisation = 2 fragments hébergés par la même activité.

startActivityForResult() établit une relation entre 2 activités, setTargetFragment() définit la relation appelant/appelé entre 2 fragments.

setTargetFragment (target) permet au fragment "appelé" de savoir où envoyer le résultat. onActivityResult() est appelée manuellement dans ce cas.

public class Caller extends Fragment
     Fragment called = Called.newInstance()
     called.setTargetFragment(this)

public class Called extends DialogFragment
   intent = amazingData
   getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)
43
kandinski

j'ai finalement découvert comment utiliser setTarget dans un fragment et je voulais partager. son tout à fait utile lorsque vous souhaitez communiquer de fragment en fragment.

voici un exemple: disons que vous vouliez afficher une boîte de dialogue et quand elle se ferme vous voulez faire une action.

donc dans votre fragment1 qui utilisera la boîte de dialogue, vous pouvez le faire:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE);

et dans votre fragment qui a appelé la boîte de dialogue, vous devez remplacer onActivityResult comme ceci:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CoDDialogFragment.REQ_CODE)
            exit(); //or whatever you want to do here
    }

et dans myDialogFragment, vous pouvez le faire:

TellTargetYouGotResults(REQ_CODE);

//...
  private void TellTargetYouGotResults(int code) {
        Fragment targetFragment = getTargetFragment(); // fragment1 in our case
        if (targetFragment != null) {
            targetFragment.onActivityResult(getTargetRequestCode(), code, null);
        }
    }

où REQ_CODE peut être n'importe quel entier bien sûr. Très utile pour la communication de fragment à fragment. mais je préfère toujours le bus d'événements car, parfois, après avoir envoyé des données à une cible, sa vue peut déjà avoir été détruite (en l'occurrence un fragment), puis si vous essayez de mettre à jour la vue dans onActivityResult, vous obtiendrez un crash. Je dirais donc qu'il est utile de simplement transmettre des données mais de ne pas mettre à jour l'interface utilisateur à moins que vous n'ayez effectué une transaction d'ajout de fragment et non un remplacement (ce qui détruit la vue mais conserve l'état).

10
j2emanue

D'après ce que j'ai pu retirer de la lecture des documents, c'est que ces méthodes sont un autre moyen d'accéder aux données d'un autre fragment. Voici un exemple de projet que j'ai écrit qui illustre un cas d'utilisation unique pour l'utilisation de ces méthodes. Je suis sûr qu'il y a plus de cas d'utilisation cependant ...

4
Alex Fu