Si je déclare un fragment XML de mise en page, comment puis-je passer un Bundle?
J'ai une activité que j'ai remplacé par un fragment. L'activité a eu l'Intention de quelques informations supplémentaires sur ce que les données de l'activité était censé afficher.
Maintenant que mon Activité est juste un wrapper autour d'un Fragment qui fait le même travail, comment puis-je obtenir ce bundle pour le Fragment si je déclare le fragment XML avec la balise?
Si je devais utiliser un FragmentTransaction de mettre le Fragment dans un ViewGroup, j'allais avoir la chance de passer cette info dans le Fragment constructeur, mais je me demandais à propos de la situation où le fragment est défini en XML.
- Essayez ceci, stackoverflow.com/questions/8641575/...
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas.
Cependant, vous êtes les bienvenus pour appeler
findFragmentById()
sur votreFragmentManager
pour récupérer le fragment de post-inflation, puis d'appeler une méthode sur le fragment d'associer des données. Alors apparemment qui ne peuvent pas êtresetArguments()
, votre fragment pouvait s'arranger pour tenir sur les données lui-même passé une modification de la configuration par d'autres moyens (onSaveInstanceState()
,setRetainInstance(true)
, etc.).setContentView()
pour les Fragments d'être gonflé. MaissetContentView()
attache également à l'Activité pour laquelle il est trop tard pour appelersetArguments()
.setArguments()
appel.setArguments()
, vous pourrait@Override
dans votreFragment
sous-classe. Traiter avec les arguments directement et de ne pas la chaîne desuper
. Aujourd'hui pas plus deIllegalStateException
. Bien sûr, la rédaction de votre propre méthode et de la coulée de votre sous-classe d'appeler c'est aussi une solution décente.Ce n'est pas encapsulé façon, mais j'ai fini par en "tirant" le bundle de l'activité parent:
Une autre option est de ne pas déclarer le fragment dans le XML. Je sais que ce n'est pas exactement ce que vous voulez faire. Cependant, vous pouvez déclarer une mise en page simple de votre point de vue comme ceci:
Et puis dans votre
Activity
de la classe, vous en programmant gonfler la mise en page avec le fragment. De cette façon, vous pouvez passer par l'intermédiaire des paramètres à l'aide args.Cette approche n'est pas aussi simple et épuré que la déclarer dans le fichier xml mais j'ai déménagé il vous donne beaucoup plus de contrôle sur le fragment.
Vous ne pouvez pas passer d'un Bundle (à moins que vous gonflez vos fragment par programme plutôt que via XML), mais vous POUVEZ passer des paramètres (ou plutôt les attributs) via XML à un fragment.
Le processus est similaire à comment vous définissez Afficher les attributs personnalisés.
Sauf AndroidStudio (pour l'instant) de ne pas vous aider dans le processus.
suppose que c'est votre fragment à l'aide des arguments (je vais utiliser kotlin, mais il fonctionne totalement en Java trop):
Et vous voulez faire quelque chose comme ceci:
Note le
app:screen_name="@string/screen_a"
pour le faire fonctionner, il suffit d'ajouter ce dans un fichier de valeurs (
fragment_attrs.xml
ou choisir n'importe quel nom que vous voulez):Presque terminé, il vous suffit de le lire dans votre fragment, ajoutez la méthode:
et voilá, vos attributs XML dans votre fragment 🙂
Limitations:
Parcelable
mais seulement ce qui peut être défini comme Android AttributsLa seule solution que je vois est de ne pas utiliser les arguments que l'échange de données de canal. Au lieu de cela, faire de votre fragment d'obtenir les informations nécessaires à partir d'ailleurs. De retour d'appel pour obtenir la bonne activité, consulter un stockage temporaire de la mémoire, un objet Singleton, etc..
Une autre solution qui peut être utile est de recruter des cadres qui permettent aux objets indépendants pour l'échange de messages via le Médiateur modèle de conception, comme Otto.
Je sais que je suis trop en retard de réponse, mais je pense que quelqu'un a besoin de ça 🙂
Juste dans l'activité de remplacer
onAttachFragment()
et du fragment onCreateView méthode