Les meilleures pratiques pour la mise à jour des arguments d'un fragment?
Je sais à propos de la "newInstance"-Modèle (Les meilleures pratiques pour l'instanciation d'un nouveau Fragment Android). Mais comment puis-je mettre à jour ces arguments d'un fragment par exemple, si un autre fragment de modifications de données?
Je sais à propos de rappel des méthodes entre les Fragments/Activitys, mais ces rappels ne mettre à jour les arguments?!
Par exemple: lors de la création de la fragment que je passe une URI de la avec le bundle.
Ensuite, un autre fragment de changements cette URI via changeUri(Uri Uri) méthode de rappel sur le premier fragment.
Si ensuite le fragment soit recréé (par exemple en raison de la rotation de l'écran), il utilise le premier de l'URI de la arguments bundle au lieu de la dernière mise à jour uri, correct?
Quelle est la meilleure pratique pour résoudre ce problème? Dois-je enregistrer manuellement dans le savedInstanceState et sur l'utilisation de décider d'utiliser le instanceState ou des arguments-bundle?
Je suis à la recherche d'un moyen standard de manipulation les arguments de mes fragments, donc je pense que je vais avec une telle approche (pseudo-code):
private Uri arg1;
public static Fragment newInstance(Uri arg1) {
create bundle
create fragment instance
set bundle to fragment
return fragment
}
private void onCreate(Bundle savedInstance) {
if(savedInstance != null) {
arg1 = savedInstance.uri
}
}
private Uri getUri() {
if(arg1 == null) {
arg1 = getArguments.uri
}
if(arg1 == null) {
arg1 = defaultValue
}
}
J'ai donc simplement d'une méthode unifiée pour accéder à mon argument. Et ne pas avoir à utiliser le si-sinon-tracas, à chaque fois que j'ai besoin de cet argument.
Qu'en pensez-vous?
- Oui. Combien de code sont en train de parler? Un oveeriden méthode -
onSaveInstanceState
- avec 1 ligne supplémentaire et un if-else dansonCreate
? - l'échec défaut de conception des fragments de ne pas dépendre des autres fragments
- Ce sujet de "réécrire" les arguments d'une méthode publique de ce fragment?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas modifier les arguments une fois son ensemble et
Fragment
est ajouté àActivity
, j'ai utilisé une approche similaire, vous avez défini vous-même.Tout d'abord, j'ai vérifié le
Bundle
passé àonCreate()
, si elle n'est pas nulle je l'utilise, mais si ses null puis-je utiliser des arguments. Et j'ai enregistrer tout ce qui est le plus récent des données dansonSaveInstanceState()
.Pour plus de détails: Est-il possible de passer des arguments à un fragment après qu'il a été ajouté à une activité?
Vous enregistrer l'état de la même manière que vous le feriez pour des Activités dans le Fragment de la onSaveInstanceState de rappel. Si vous avez mis à jour l'URI depuis la dernière
onCreate()
, vous souhaitez enregistrer les mises à jour de l'URI dans leBundle
, et bénéficierait de ce retour enonCreate()
. Enregistrement de l'état est exactement ce que c'est conçu pour, et par l'évolution de l'URI, tout ce que vous avez fait est changé d'état.Je viens de changer la valeur dans le bundle.
Exemple:
Et mise à jour de contenu avec de nouveaux Argument
Best practice for updating arguments of a fragment
: Pourquoi avons-nous besoin d'ajouter l'argument ParNewInstance()
méthode & pourquoi c'est les meilleures pratiques pour le fragment?Fragment peut être penser comme un système modulaire de la section d'une activité. Cela signifie que lorsque nous créons un fragment nous avons besoin pour le rendre modulaire & indépendant.
Supposons que vous avez besoin d'un fragment qui ont besoin d'un argument pour fonctionner.On peut également l'écrire
Il fonctionne aussi très bien & vous pouvez obtenir de l'argument
onCreate
méthode. Ici c'est la différence que vous pouvez également faire un exemple de fragment sans argument et l'ajouter à fragment de gestionnaire, mais votre fragment besoins argument pour fonctionner. L'ajout denewInstance
méthode du fragment forces développeur d'ajouter argument alors que la création. C'est pourquoi il est dit que les meilleures pratiques.Dans votre problème, vous pouvez utiliser
setRetainInstance(boolean retain)
qui empêchent votre fragment de ne pas détruire lorsque l'activité est détruite.Selon la façon dont vous utilisez vos fragments peuvent déterminer quelle est l'efficacité de cette stratégie sera.
Par exemple, si vous avez de nombreux fragments dans l'onglet commun/vue pager modèle et sont les gérer avec un FragmentStatePagerAdapter il peut être l'occasion pour votre activité ou d'autres fragments de faire référence à un fragment d'instance qui n'existe plus provoquant une exception de pointeur null.
Un moyen que vous pourriez obtenir autour de cela, si vous ne voulez pas écrire des rappels, est d'utiliser les Intentions et BroadcastReceivers (qui peut être un peu exagéré, et dur à gérer, mais si c'est fait correctement, peut sauver beaucoup de maux de tête dans mon expérience) pour envoyer et recevoir des émissions et de l'activité parent.
La belle chose à propos de ses intentions, c'est qu'ils peuvent être à l'écoute de travail à des moments spécifiques et accepte un large éventail de données extras, y compris bottes et colis-mesure d'objets.
En cas vous souhaitez réutiliser un fragment, mais besoin de mettre à jour les arguments, vous devez utiliser fragment.getArguments().putAll(bundle);
fragment.setArguments(bundle)
peut produirejava.lang.IllegalStateException
si vous revenez à l'existant, fragment de l'Activité