42 votes

Quel est l'intérêt de setArguments ?

Bonjour, je regardais l'exemple suivant de Fragments sur le site Android.

http://developer.Android.com/guide/components/fragments.html#Example

J'aimerais savoir pourquoi certaines méthodes sont appliquées.

Pourquoi par exemple, dans le detailsFragment la méthode suivante est effectuée :

public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();

    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);

    return f;
}

Ne pourriez-vous pas aussi simplement instancier le DetailsFragment et utiliser une méthode setter pour définir index à la place. En contournant l'ensemble setArguments .

Quel est l'intérêt d'utiliser setArguments en premier lieu ? Ne pourriez-vous pas simplement utiliser des setters et des getters ?

3 votes

Récemment, il est devenu courant que la fonctionnalité principale d'une application soit encapsulée dans Fragments et on a alors Activities gérer essentiellement l'agencement (et la navigation entre) des écrans composés desdits fragments. Avec un Activity vous pouvez passer un Bundle d'extras dans une intention et y avoir accès immédiatement à partir de onCreate() . Fragments ne répondent pas aux intentions, donc à la place vous pouvez utiliser setArguments() pour lui fournir un Bundle "d'extras" avant qu'il ne soit créé.

0 votes

@Karakuri merci c'est utile de le savoir.

1 votes

Jetez un coup d'œil à celui-ci : stackoverflow.com/a/7160253/334493

40voto

Matthew Runo Points 53

Vous pouvez utiliser des getters et des setters, mais en passant dans un bundle, vous n'avez pas besoin d'écrire ce code, puisqu'il est déjà là. En outre, je crois que ces arguments sont automatiquement réintroduits si l'orientation de l'écran change, ce qui facilite également la vie.

En fait, setArguments et getArguments ne sont qu'un modèle de conception que Google vous suggère de suivre :

Chaque fragment doit avoir un constructeur vide, afin qu'il puisse être instancié lors de la restauration de l'état de son activité. Il est fortement recommandé que les sous-classes n'aient pas d'autres constructeurs avec des puisque ces constructeurs ne seront pas appelés lorsque le fragment fragment est ré-instancié ; à la place, les arguments peuvent être fournis par le l'appelant avec setArguments(Bundle) et récupérés plus tard par le fragment avec getArguments(). http://developer.Android.com/reference/Android/app/Fragment.html

Je considère que cela inclut les setters qui sont nécessaires au fonctionnement de votre fragment. Mais là encore, rien ne vous oblige à procéder de cette manière et, comme vous le savez, ce n'est pas la seule façon de faire fonctionner les choses.

0 votes

C'est bien, juste deux façons différentes de faire le même travail - bien. Votre deuxième point rend l'utilisation de setArguments plus intéressante que celle des setters et getters, si c'est vrai. Dans ce cas, je ne suis pas sûr que cela fasse une différence. Mais je peux me tromper.

0 votes

Que diriez-vous de deux constructeurs ; un vide, et un qui accepte l'état initial du fragment. Un fragment peut alors utiliser le paquet passé dans onSaveInstanceState() et onCreate() pour garder l'état d'instance ?

0 votes

Glenn, normalement, ce que je fais est d'avoir une méthode statique getInstance(..) qui crée un paquet avec tous les arguments et utilise setArguments() sur une nouvelle instance du fragment. De cette façon, vous avez un "constructeur" facile à appeler, les arguments sont définis, et Android a un constructeur vide qu'il peut utiliser en interne.

25voto

sstn Points 1692

Juste pour ajouter à la réponse de Matthew : il a cité correctement que les fragments doivent avoir un constructeur vide, de sorte que le framework puisse les ré-instancier en cas de besoin.

Vous pouvez utiliser des getters et des setters, mais comme le framework peut détruire et recréer votre fragment, vous devez veiller à ne pas perdre ces paramètres.

Cela doit être fait via Fragment.onSaveInstanceState() . L'énoncé sauvegardé vous sera transmis en tant que paramètre. savedInstanceState en Fragment.onCreate() , Fragment.onCreateView() et plusieurs autres méthodes.

Utilisation de Fragment.setArguments() est (dans la plupart des cas, je suppose) plus facile, car le framework préservera automatiquement les arguments et fera donc le plus gros du travail pour vous.

Les Setters peuvent être la solution pour les paramètres que vous fournissez au Fragment initialement et que le fragment peut ajuster lui-même au fil du temps. Dans ce cas, il peut être plus facile de traiter le savedInstanceState seul que de traiter le savedInstanceState et les arguments - où vous devez décider quel est le paramètre valide.

4 votes

Il s'agit d'un aspect essentiel de la compréhension de Fragments qui, à mon avis, est grotesquement sous-documenté. Votre réponse nous donne un aperçu de la situation. Si vous ne voulez pas utiliser setArguments, et que vous voulez plutôt utiliser un setter, alors vous DEVEZ utiliser onSaveInstanceState ou Android ne sera pas capable de réinitialiser votre fragment ? Bon sang !

3 votes

@rmirabelle La sous-documentation me semble être le cas pour beaucoup de cas dans Android, malheureusement. J'ai découvert beaucoup de cas qui ne sont pas possibles ou problématiques et qui ne sont soit pas documentés du tout, soit seulement sous forme de side-node quelque part ou de réponse stackoverflow/google groups quelque part.

6voto

AKh Points 1398
public void setArguments (Bundle args)

Fournir les arguments de construction pour ce fragment. Ceci ne peut être appelé avant que le fragment ait été attaché à son activité ; c'est-à-dire que vous devez l'appeler immédiatement après avoir construit le fragment. Les arguments de Les arguments fournis ici seront conservés lors de la destruction et de la création de fragments. création (il se peut que le texte en gras soit absent du document officiel) officielle auparavant)

Fragments.setArguments(Bundle args)

1voto

Rene B. Points 71

De plus, les setters peuvent être mal utilisés. Si updateSomeOtherStuff() modifie une vue, cela provoquera un crash.

public class MyFragment extends Fragment {
   void setData(someData){
       this.someData = someData;
       updateSomeOtherStuff()
   }
}

Si l'on passe dans un bundle, il n'est pas possible de faire un mauvais usage du setter et vous saurez toujours qu'il sera défini dans les méthodes du cycle de vie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X