Si je déclare un fragment dans une mise en page XML, comment puis-je lui passer un lot?

J’ai une activité que j’ai remplacée par un fragment. L’activité a pris une intention qui contenait des informations supplémentaires sur les données que l’activité était censée afficher.

Maintenant que mon activité est juste un wrapper autour d’un fragment qui fait le même travail, comment puis-je envoyer ce paquet au fragment si je déclare le fragment en XML avec la balise?

Si je devais utiliser une FragmentTransaction pour placer le Fragment dans un ViewGroup, j’aurais une chance de transmettre ces informations dans le constructeur Fragment, mais je m’interroge sur la situation dans laquelle le fragment est défini en XML.

Maintenant que mon activité est juste un wrapper autour d’un fragment qui fait le même travail, comment puis-je envoyer ce paquet au fragment si je déclare le fragment en XML avec la balise?

Vous ne pouvez pas

Cependant, vous pouvez appeler findFragmentById() sur votre FragmentManager pour récupérer le fragment post-inflation, puis appeler une méthode sur le fragment pour lui associer des données. Bien qu’apparemment ce ne peut pas être setArguments() , votre fragment pourrait s’arranger pour conserver les données elles-mêmes après un changement de configuration ( onSaveInstanceState() , setRetainInstance(true) , etc.).

Ce n’est pas une manière encapsulée, mais j’ai fini par “tirer” le paquet de l’activité parent:

 Bundle bundle = getActivity().getIntent().getExtras(); 

Une autre option consiste à ne pas déclarer le fragment dans le XML. Je sais que ce n’est pas exactement ce que vous voulez faire. Cependant, vous pourriez déclarer une disposition simple dans votre vue comme ceci:

   

Et puis dans votre classe d’ Activity , vous gonflez par programme la mise en page avec le fragment. De cette façon, vous pouvez passer à travers les parameters en utilisant args.

  FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment fragment = MyFragment.newInstance(); Bundle args = new Bundle(); args.putInt(Global.INTENT_INT_ROLE, 1);' fragment.setArguments(args); fragmentTransaction.add(R.id.fragment_container, fragment, "MyActivity"); fragmentTransaction.commit(); 

Cette approche n’est pas aussi simple et claire que de la déclarer dans le fichier XML, mais je l’y ai déplacé, car cela vous donne beaucoup plus de contrôle sur le fragment.

La seule solution que je vois consiste à ne pas utiliser les arguments comme canal d’échange de données. Au lieu de cela, faites votre fragment pour obtenir les informations nécessaires d’ailleurs. Rappeler pour obtenir l’activité appropriée, consulter une mémoire de stockage temporaire, un object Singleton, etc.

Une autre solution qui peut être utile consiste à utiliser des frameworks permettant aux objects non apparentés d’échanger des messages via un modèle de conception Mediator, comme Otto .